难以访问在Interface Builder .xib文件中创build的UITableViewCell

在我的UITableView中,对于表的最后一部分的最后一行,我加载了一个与表中所有其他部分不同的特殊UITableViewCell。 我在我的.xib文件中创build了单元格,并为它提供了重用标识符“endCell”。 我会认为我可以做以下访问我的单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if ((indexPath.section == [sections count] - 1) && indexPath.row == [[sections objectAtIndex:indexPath.section] count])) { return [tableView dequeueReusableCellWithIdentifier:@"endCell"]; } //more code for other cells... 

我已经在界面生成器中设置了单元格标识符。 但是,运行此代码会导致崩溃并出现错误:

 "Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:],..." 

在研究这个错误之后,唯一能find的解决scheme就是通过一个包含.xib中包含的对象的数组来访问.xib单元格的指针。 所以我尝试了以下几点:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { if ((indexPath.section == [sections count] - 1) && (indexPath.row == [[sections objectAtIndex:indexPath.section] count]) ) { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"endCell"]; if (cell == nil) { cell = [[UITableViewCell alloc]init]; NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"PLNewConversationViewController" owner:self options:nil]; for (id xibItem in topLevelObjects) { if ([xibItem isKindOfClass:[UITableViewCell class]]){ UITableViewCell *tableViewCell = (UITableViewCell *)xibItem; if ([tableViewCell.reuseIdentifier isEqualToString:@"endCell"]) { cell = xibItem; } } } } return cell; } //more code for other cells... 

这导致了非常奇怪的行为 – 它对我来说甚至都不是很明显 – 最后一个单元从来没有显示出来,它似乎是无止境的滚动,因为当它到达表底部时,它会自动跳回到桌子的顶部。 有时会出现不同的错误。

我设法解决这个问题,把我的单元格连接到必要的类作为出口,然后将单元格作为“return self.endCell …”返回,但我觉得我应该能够访问单元格而不这样做。

任何人都可以看到我做错了什么?

从nib文件加载自定义表格视图单元格的最简单方法是在单独的 xib文件(仅包含该单元格)中创build它们,并将生成的nib文件注册到

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

例如在表视图控制器的viewDidLoad中。

 [tableView dequeueReusableCellWithIdentifier:@"YourReuseIdentifier"] 

将根据需要从该nib文件实例化单元。