2013-06-24 72 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標識符都相同。這使操作系統能夠更有效地管理單元的內存。

相關問題