2013-06-24 41 views
0

我有一个主要问题。我已经实现了分页的可用视图,但是当我到达行700应用程序崩溃时,有时它也会重新启动ipad。所以我尝试了每一件事,但我没有得到解决方案。这是我的代码。加载600行后UITableview页面崩溃应用程序

#pragma mark - Table View 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (dataArray.count<[self.allRecordCount intValue]) 
    { 
     return dataArray.count+1; 
    } 
return dataArray.count; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
if (dataArray.count<[self.allRecordCount intValue]) 
    { 
     if (indexPath.row < dataArray.count) { 
      return [self dataCellForIndexPath:indexPath tableview:tableView]; 
    } else { 
     return [self loadingCell]; 
    } 
}else{ 
    return [self dataCellForIndexPath:indexPath tableview:tableView]; 
} 

} 
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
if (cell.tag == kLoadingCellTag) { 

    [self fillDataArray]; 
} 
} 
     - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    { 

    return 150; 
    } 
#pragma mark PAGING_LOGIC 
-(void)fillDataArray 
{ 
self.strStartPoint=[NSString stringWithFormat:@"%d",[dataArray count]]; 
self.strPageSize=[NSString stringWithFormat:@"%d",kPageSize]; 
NSMutableArray *temp=[manager returnCallArray:self.strStartPoint NoofRecord:self.strPageSize]; 
for (Call *obj in temp) 
{ 
    [dataArray addObject:obj]; 
} 
[temp release]; 
[tbl reloadData]; 
} 

- (UITableViewCell *)loadingCell { 
UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
               reuseIdentifier:nil] autorelease]; 

    UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] 
                initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    activityIndicator.frame=CGRectMake(480.5f,52.5f , 45, 45); 


    [cell addSubview:activityIndicator]; 
    [activityIndicator release]; 

    [activityIndicator startAnimating]; 

    cell.tag = kLoadingCellTag; 

return cell; 
} 


- (UITableViewCell *)dataCellForIndexPath:(NSIndexPath *)indexPath tableview:(UITableView *)table 
{ 

NSString *CellIdentifier = [NSString stringWithFormat:@"%d %d",indexPath.section,indexPath.row]; 
UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:CellIdentifier]; 
if(table.tag == 0){ 

    //cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UILabel *lblCall;UILabel *lblCallText;UILabel *lblAirComment;UILabel *lblCustomerTxt;UILabel *lblProximityTxt; 

    UILabel *lblNoOfMachineTxt; 
    UILabel *lblCallReceiveTxt; 
    UILabel *lblCallDueTxt; 
if (cell==nil) { 
Call *temp = [dataArray objectAtIndex:indexPath.row]; 
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
             reuseIdentifier:CellIdentifier] autorelease]; 
lblCall = [[UILabel alloc]initWithFrame:CGRectMake(20,setY,220,20)]; 
     lblCall.backgroundColor = [UIColor clearColor]; 
     lblCall.text = @"Call Priority/Type/Status"; 
     [cell.contentView addSubview:lblCall]; 
     [lblCall release]; 
lblCallText = [[UILabel alloc]initWithFrame:CGRectMake(220,setY,270,20)]; 
     lblCallText.backgroundColor = [UIColor clearColor]; 


     lblCallText.tag = indexPath.row+100; 
[cell.contentView addSubview:lblCallText]; 
     [lblCallText release]; 
lbl_strstatusChangeReason = [[UILabel alloc] init];/ 
lbl_strstatusChangeReason.frame=CGRectMake(20,setY,800, labelSize5.height); 
     lbl_strstatusChangeReason.backgroundColor = [UIColor clearColor]; 
     lbl_strstatusChangeReason.text = str_changeStatusReasoon; 
     lbl_strstatusChangeReason.tag = indexPath.row + 200000; 
     lbl_strstatusChangeReason.numberOfLines = 0; 
     lbl_strstatusChangeReason.lineBreakMode = UILineBreakModeWordWrap; 
     lbl_strstatusChangeReason.textColor = [UIColor redColor]; 
     [cell.contentView addSubview:lbl_strstatusChangeReason]; 
} 
return cell; 
} 

这是我用来填充细胞的NSObject。

#import <Foundation/Foundation.h> 

@interface Call : NSObject { 

NSString *strType; 
NSString *strTypePriority; 
NSString *strCustomer; 
NSString *strProximity; 
NSString *strETADateTime; 

NSString *str480; 
NSString *strAirComment; 
NSString *strProblemDesc; 
NSString *strNumberOfMachine; 
NSString *strCallReceived; 
NSString *strCallDue; 
NSString *strAssignedTech; 
    NSString *strAssignedTechName; 
NSString *strDefaultTech; 
    NSString *strDefaultTechName; 
NSString *strDispatchedBy; 
} 
@property(nonatomic,retain)NSString *strDispatchedToTechInterval; 
@property(nonatomic,retain)NSString *strDispatchedToBranchInterval; 

@property(nonatomic,retain)NSString *strDispatchToTechnicianDate; 
@property(nonatomic,retain)NSString *strDispatchToTechnicianTime; 
@property(nonatomic,retain)NSString *strDispatchToTechnicianFrom; 
@property(nonatomic,retain)NSString *strDispatchToTechnicianBy; 

@property(nonatomic,retain)NSString *strCallClosedDateAndTimeSorting; 
@property(nonatomic,retain)NSString *strCallClosedDateAndTime; 
@property(nonatomic,retain)NSString *strCallClosedDate; 
@property(nonatomic,retain)NSString *strCallClosedTime; 
@property(nonatomic,retain)NSString *strtotalAmount; 
@property(nonatomic,retain)NSString *strtotalPartAmount; 
@property(nonatomic,retain)NSString *strtotalChargeAmount; 
@property(nonatomic,retain)NSString *strOriginatingFacility; 
@property(nonatomic,retain)NSString *str_RecordVersionNumber; 
@property(nonatomic,retain)NSString *str_CustomerLatitude; 
@property(nonatomic,retain)NSString *str_CustomerLongitude; 
@property(nonatomic,retain)NSString *strDiscount; 
@property(nonatomic,retain)NSString *str_HdrComment1; 
@property(nonatomic,retain)NSString *str_PrioritySortValue; 
@property(nonatomic,retain)NSString *str_StatusChangeReason; 
@property(nonatomic,retain)NSString *str_OnSiteDate; 
@property(nonatomic,retain)NSString *str_Address; 
@property(nonatomic,retain)NSString *str_Address1; 
@property(nonatomic,retain)NSString *str_Address2; 
@property(nonatomic,retain)NSString *str_City; 
@property(nonatomic,retain)NSString *str_State; 
@property(nonatomic,retain)NSString *str_Zip; 
@property(nonatomic,retain)NSString *strStatus; 
@property(nonatomic,retain)NSString *strTypePriority; 
@property(nonatomic,retain)NSString *strCustomer; 
@property(nonatomic,retain)NSString *strProximity; 
@property(nonatomic,retain)NSString *str480; 
@property(nonatomic,retain)NSString *strAirComment; 
@property(nonatomic,retain)NSString *strProblemDesc; 
@property(nonatomic,retain)NSString *strNumberOfMachine; 
@property(nonatomic,retain)NSString *strCallReceived; 
@property(nonatomic,retain)NSString *strCallDue; 
@property(nonatomic,retain)NSString *strAssignedTech; 
@property(nonatomic,retain)NSString *strDefaultTech; 
@property(nonatomic,retain)NSString *strDispatchedBy; 
@end 

#import "Call.h" 

@implementation Call 


@synthesize strStatus; 
@synthesize strTypePriority; 
@synthesize strCustomer; 
@synthesize strProximity; 
@synthesize str480; 
@synthesize strAirComment; 
@synthesize strProblemDesc; 
@synthesize strNumberOfMachine; 
@synthesize strCallReceived; 
@synthesize strCallDue; 
@synthesize strAssignedTech; 
@synthesize strDefaultTech; 
@synthesize strDispatchedBy; 

@synthesize strCallNumber; 
@synthesize strHoldCall; 
@synthesize strOpenCall; 
@synthesize strLoactionId; 
@synthesize strCustomerName; 
@synthesize strContactName; 
@synthesize strPhoneNo; 
@synthesize strFirsMachine; 
@synthesize strMachineDone; 
@synthesize strDispatchedToBranch; 
@synthesize strDispatchedToTech; 
@synthesize strServiceDue; 
@synthesize strCallComment; 
@synthesize strDiscount; 
- (void)dealloc { 

[strStatus release]; 
[strTypePriority release]; 
[strCustomer release]; 
[strProximity release]; 
[str480 release]; 
[strAirComment release]; 
[strProblemDesc release]; 
[strNumberOfMachine release]; 
[strCallReceived release]; 
[strCallDue release]; 
[strAssignedTech release]; 
[strDefaultTech release]; 
[strDispatchedBy release]; 
[strCallNumber release]; 
[strHoldCall release]; 
[strOpenCall release]; 
[strLoactionId release]; 
[strCustomerName release]; 
[strContactName release]; 
[strPhoneNo release]; 
[strFirsMachine release]; 
[strMachineDone release]; 
[strDispatchedToBranch release]; 
[strDispatchedToTech release]; 
[strServiceDue release]; 
[strCallComment release]; 
[strDiscount release]; 
[str_StatusChangeReason release]; 
[super dealloc]; 
} 

这是我用于填充数组进行分页的方法。

-(NSMutableArray *)returnCallArray:(NSString *)startPoint NoofRecord:(NSString *)noOfRecord 
{ 
[self initiateFMDB]; 
    NSMutableArray *aryCallFilterData=[[NSMutableArray alloc]init]; 
    // NSMutableArray *finalArrayCall=[[NSMutableArray alloc]init]; 
@try { 
    if(![db open]){ 
     NSLog(@"Could not open DB"); 
    } 
    else{ 
      resultset = [db executeQuery:[NSString stringWithFormat:@"select Call_HDR.*,Problem.Machine,Problem.ServiceStatusFlag,AssignTech.RepName AS AssignTechName,DefaultTech.RepName AS DefaultTechName,Problem.ProblemDescription AS ProblemDescription,Problem.SLAHours AS SLAHours,ARComment.CustARComments As CustARComments,SLAResponseCode.SLAResponse As SLAResponse from CALL_HDR LEFT JOIN Branch_Reps as AssignTech ON CALL_HDR.RepID = AssignTech.RepID LEFT JOIN Branch_Reps as DefaultTech ON CALL_HDR.AssignedServiceRep = DefaultTech.RepID LEFT JOIN CALL_MACHINE as Problem ON CALL_HDR.CallNumber||'*001' = Problem.CallNumberWSeqnbr LEFT JOIN Customers as ARComment ON CALL_HDR.LocationID = ARComment.LocationID LEFT JOIN NA_Data as SLAResponseCode ON CALL_HDR.CustomerTypeCode = SLAResponseCode.NationalAccountCode where CALL_HDR.CallStatus IN ('%@','%@') LIMIT %@,%@ ",STATUS_CLOSED,STATUS_CANCELLED,startPoint,noOfRecord]]; 
    } 
} 
@catch (NSException * e) { 
    NSLog(@"Exception error for selectFromItemPhoto is %@",[e reason]); 
} 
if (!resultset) { 
    NSLog(@"no result set fechted"); 
    } 
    while ([resultset next]) { 
    NSString *strCallPrioritySortValue = [resultset stringForColumn:@"PrioritySortValue"]; 
    NSString *strCallPriority = [resultset stringForColumn:@"CallPriority"]; 
    NSString *strCallType = [resultset stringForColumn:@"CallType"]; 
    NSString *strCallStatus = [resultset stringForColumn:@"CallStatus"]; 
    NSString *strCustomerName = [resultset stringForColumn:@"CustomerName"]; 
    NSString *strAdd1 = [resultset stringForColumn:@"Address1"]; 
    NSString *strAdd2 = [resultset stringForColumn:@"Address2"]; 
    NSString *strCity = [resultset stringForColumn:@"City"]; 
    NSString *strState = [resultset stringForColumn:@"State"]; 
    NSString *strZip = [resultset stringForColumn:@"Zip"]; 
    NSString *[email protected]""; 
    ObjModel.strStsChgByRep=strStatusChgByRep; 
    ObjModel.strCustomer = strCustomer; 
    ObjModel.strStatus = strCallStatus; 
    ObjModel.strHoldCall =strHoldCode; 
    ObjModel.strProximity = @""; 
    ObjModel.f_proximity = 0.0f; 
    ObjModel.str480 = strStr480; 
    ObjModel.strProblemDesc = strProbleDesc; 
    ObjModel.strNumberOfMachine =strNumberOfMachine; 
    ObjModel.strCallReceived = strCallReceive; 
    ObjModel.strCallDue = strCallDue; 
    ObjModel.strAssignedTech = strAssignedTech; 
    ObjModel.strDefaultTech = strDefaultTech; 
    ObjModel.strDispatchedBy = strDispatchedBy; 
    ObjModel.strCallNumber = strCallNumber; 
    ObjModel.n_CallNumber = [strCallNumber intValue]; 
    ObjModel.strLoactionId = strLoactionId; 
    ObjModel.strContactName = strContactName; 
    ObjModel.strCustomerName = strCustomerName; 
    ObjModel.strPhoneNo = strPhoneNo; 
    ObjModel.strDiscount = strDisct; 
    ObjModel.strAirComment = strAirComment; 
    ObjModel.strAssigntechName = strAssignedTechBy; 
    ObjModel.strRepId = strRepId; 
    ObjModel.str_Address1 = strAdd; 
    ObjModel.str_StatusChangeReason = strStatusChangeReason; 
    [aryCallFilterData addObject:ObjModel]; 
    [ObjModel release]; 
    } 
return aryCallFilterData; 
} 

所以请检查我的代码,并提出一些建议,以便我可以解决崩溃。

这是崩溃日志:

Received memory warning. 
2013-06-24 04:59:26.168 MFSS_PAGING_FACEBOOK[874:907] <FMDatabase: 0x2d8aa130> executeQuery: select Call_HDR.*,Problem.Machine,Problem.ServiceStatusFlag,AssignTech.RepName AS AssignTechName,DefaultTech.RepName AS DefaultTechName,Problem.ProblemDescription AS ProblemDescription,Problem.SLAHours AS SLAHours,ARComment.CustARComments As CustARComments,SLAResponseCode.SLAResponse As SLAResponse from CALL_HDR LEFT JOIN Branch_Reps as AssignTech ON CALL_HDR.RepID = AssignTech.RepID LEFT JOIN Branch_Reps as DefaultTech ON CALL_HDR.AssignedServiceRep = DefaultTech.RepID LEFT JOIN CALL_MACHINE as Problem ON CALL_HDR.CallNumber||'*001' = Problem.CallNumberWSeqnbr LEFT JOIN Customers as ARComment ON CALL_HDR.LocationID = ARComment.LocationID LEFT JOIN NA_Data as SLAResponseCode ON CALL_HDR.CustomerTypeCode = SLAResponseCode.NationalAccountCode where CALL_HDR.CallStatus IN ('8','0') LIMIT 700,100 

感谢

+0

不,您有责任合理调试。不要只在互联网上投入数百行代码。找出问题所在。开始注释行,看看它是否会影响情况等。 – borrrden

+0

您是否收到一些内存警告? –

+0

borrrden,我花了很多时间仔细检查了这段代码,我明确提到在表格应用程序中滚动700行后崩溃。而我发布此代码的担忧是,代码中是否有任何问题,或者可能会影响我在我的nsobject中使用了大量字符串,或者我的数据提取方法不正确。并且如果有人正在寻找它,那么他可以很容易地找出代码中出了什么问题。任何方式感谢您的建议。 – Nikh1414

回答

1

你应该重用你的细胞。你有太多的UITableViewCells加载到内存中,并且在内存警告后崩溃。

当您加载700行数据时,您的单元标识符(索引+行)会创建与700一样多的单元。小区标识符对于屏幕中显示的单元格数量应该是唯一的,不能超过这个数量。最好的是,你可以有一些其他简单和不循环的单元标识符。所以细胞更有效地被重用。

尝试使用相同的UITableViewCell,但更改与要显示的信息匹配的标签和detailLabel。

+0

是的karim,在栈上发布代码后,我做了这个改变,现在我可以很容易地加载1000行,但现在我面临一个问题,每行的高度发生了变化,并且由于行被重叠在一起。因为我认为CGSize constraintSize5 = CGSizeMake(800,MAXFLOAT); CGSize labelSize5 = [str_changeStatusReasoon sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:constraintSize5 lineBreakMode:UILineBreakModeWordWrap];没有给出完美的高度,所以有没有其他方法可以计算标签的动态高度。谢谢。 – Nikh1414

+0

以及计算文本(标签)的高度,您必须覆盖UITableView委托的heightForRowAtIndexPath委托方法。您应该使用该方法计算高度。我希望那样会好的。 – karim

0

值得一看的是dequeueReusableCellWithIdentifier在代码中的使用。从我可以告诉你正在为每个数据项目创建一个新的单元格,因为您正在使用单元格部分和行作为和标识符。是否有一个原因?如果您的单元格在视觉上相同(只有每个单元格的数据不同),则更改此设置,以便每个单元格的dequeueReusableCell标识符都相同。这使操作系统能够更有效地管理单元的内存。

相关问题