2013-05-08 86 views
0

當滾動tableview時,我收到EXC_BadAccess錯誤消息。滾動tableview時獲取EXC_Bad_Access

以下是我在cellForRowAtIndexPath中完成的代碼。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *[email protected]"customCellHistory"; 

    customCellHistory *cell=(customCellHistory*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell == nil) { 
     NSArray *topLevelObjects=[[NSBundle mainBundle]loadNibNamed:@"customCellHistory" owner:self options:nil]; 
     for (id currentObject in topLevelObjects) { 
      if ([currentObject isKindOfClass:[UITableViewCell class]]) { 
       cell=(customCellHistory*)currentObject; 
       break; 
      } 
     } 
    } 

    cell.lb11.text=[cellArray1 objectAtIndex:indexpath.row]; 
    cell.lbl2.text=[cellArray2 objectAtIndex:indexpath.row]; 

    return cell; 
} 

我能感覺到問題是由於上面的代碼中的一些錯誤而引起的。

我在上面的代碼中使用了CustomCell來顯示自定義的單元格。

誰能告訴我,我是用這個代碼

回答

1

嘿嘗試下面的代碼,不要忘記set the cell identifier在您自定義的XIB到customCellHistory

在頂部

#import "customeCellHistory.h" 

然後

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *cellIdentifier = @"customCellHistory"; 

    customCellHistory *cell = (customCellHistory *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
     NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"customCellHistory" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 

    cell.lb11.text=[cellArray1 objectAtIndex:indexpath.row]; 
    cell.lbl2.text=[cellArray2 objectAtIndex:indexpath.row]; 

    return cell; 
} 
+0

嗨,我收到錯誤「[__NSArrayI objectAtIndex:]:發送到釋放實例的消息」。 – surendher 2013-05-09 10:24:57

+0

你什麼時候得到這個錯誤? – icodebuster 2013-05-09 11:58:32

+0

您是否創建了自定義單元格NIB並將其cellIdentifier設置爲'customCellHistory' – icodebuster 2013-05-09 12:02:03

0

這個問題似乎來自你有奇怪的循環,產生做了什麼錯。使用最後一個對象方法從筆尖設置單元格。

0

您正在重複使用單元格,然後更改循環中的單元格,這可能會導致單元格不存在於您正在查找的位置。

0
if (cell == nil) { 
    NSArray *topLevelObjects=[[NSBundle mainBundle]loadNibNamed:@"customCellHistory" owner:self options:nil]; 

您不需要該代碼。只需註冊與表視圖筆尖,早前:

[self.tableView registerNib:[UINib nibWithNibName:@"customCellHistory" bundle:nil] 
forCellReuseIdentifier:@"customCellHistory"]; 

現在當你調用dequeueReusableCellWithIdentifier,筆尖會被加載和小區將交付,如果在複用一堆沒有備用電池。這確保您始終擁有一個單元格,並且它是正確的單元格。使用框架爲您提供的方法。

+0

這取決於您的部署目標設置。如果你只支持iOS 5和6,你的答案是正確的,但如果你想支持iOS 4.x,原始代碼就是實現它的方法。 – hagi 2013-05-08 17:52:13

+0

原始代碼可能是在iOS 4上執行的一種方式。但這並不能使其成爲*方式。這是另一種方式,我曾經在iOS 4上使用過(比OP的代碼更安全,更簡單,也更高效):https://github.com/mattneub/Programming-iOS-Book-Examples/blob /master/iOS4bookExamples/p516p531addCellSubviewsNibOutlets/p516addCellSubviewsNibOutlets/RootViewController.m – matt 2013-05-08 17:58:00