2

在我的 UITableView 中,对于表格最后一部分的最后一行,我加载了一个特殊的 UITableViewCell,它与表格上的所有其他元素都不同。我在我的 .xib 文件中创建了单元格,并为其指定了重用标识符“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:],..."

在研究了这个错误之后,我能找到的唯一解决方案是通过一个包含 .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 ...”来解决这个问题,但我觉得我应该能够在不这样做的情况下访问单元。

谁能看到我做错了什么?

4

1 回答 1

3

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

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

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

[tableView dequeueReusableCellWithIdentifier:@"YourReuseIdentifier"]

如有必要,将从该 nib 文件中实例化单元格。

于 2013-07-01T19:58:45.677 回答