在reloadRowsAtIndexPaths中崩溃,“无法在bundle中加载NIB”

时间:2014-01-27 06:07:31

标签: ios objective-c uitableview

在我的应用中,我需要扩展tableviewcell,当用户点击该单元格中的特定按钮(类似于切换,点按将展开行并在其他时间录制将折叠行时)。所以我已经实现了自定义委托方法,以了解需要重新加载哪个单元格并使用'reloadRowsAtIndexPaths'重新加载该特定单元格。

第一次点击按钮时工作正常,甚至是第二次,但它第三次崩溃时说“无法在包中加载NIB:'NSBundle </Users/path/myApp.app> (loaded)'名称为'ContactCell''

我的问题是重新加载第一次和第二次为什么第三次崩溃的细胞?

我的代码:

[contactTableView beginUpdates];   // Inside the custom delegate method
[contactTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexpath] withRowAnimation:UITableViewRowAnimationNone]; // indexpath is which i get from cell through custom delegate method
[contactTableView endUpdates];

 ContactTableCell *cell; //Inside the cellForRowAtIndexPath
    static NSString *CellIdentifier = @"ContactCell";

    cell =  [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        // load a new cell from the nib file
        [[NSBundle mainBundle] loadNibNamed:@"ContactCell" owner:self options:nil];
        cell = self.contactCell;
        cell.delegate = self;
        cell.indexPath = indexPath;
        self.contactCell = nil;
    }

为什么会崩溃?

2 个答案:

答案 0 :(得分:1)

好的,这有几个问题。首先,从nib加载不应该在这个类中,它应该在ContactTableCell方法中init方法(initWithNib或你想要的方式)

您的XIB需要确保ContactTableCell也是分配给它的自定义类。

所以使用nib的init会像这样

//in ContactTableCell.m
-(id)initWithNib{
      self = [[[NSBundle mainBundle] loadNibNamed:@"ContactCell" owner:self options:nil] firstObject];
      if(self){
         //do extra customisation stuff/ set labels etc.
      }
      return self;
 }

然后你会打电话给

if (cell == nil) {
    // load a new cell from the nib file
    cell = [[ContactTableCell alloc] initWithNib];
    cell.delegate = self;
    cell.indexPath = indexPath;
}

答案 1 :(得分:0)

viewDidLoad注册你的笔尖一次。

 NSString *cellIdentifier=@"cellIdentifier";

 UINib *nib=[UINib nibWithNibName:cellIdentifier bundle:[NSBundle mainBundle]];

 [self.yourTableView registerNib:nib forCellReuseIdentifier: cellIdentifier];

希望这会起作用