加载600行后的UITableview分页崩溃应用程序

时间:2013-06-24 08:33:38

标签: ios uitableview pagination

我有一个主要问题。我已经使用分页实现了一个非常合适的视图但是当我到达第700行时,应用程序崩溃了,有时它还会重新启动ipad。所以我尝试了所有的东西,但我没有得到解决方案。这是我的代码。

#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 *strCustomer=@"";
    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

由于

2 个答案:

答案 0 :(得分:1)

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

当您加载700行数据时,您的单元格标识符(索引+行)会创建与700一样多的单元格。单元标识符应该对屏幕中显示的单元格数量唯一,不超过该数量。最好的是,您可以使用其他一些简单且非循环的单元标识符。因此,细胞可以更有效地重复使用。

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

答案 1 :(得分:0)

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