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

Posted

技术标签:

【中文标题】难以访问在 Interface Builder .xib 文件中创建的 UITableViewCell【英文标题】:Difficulty Accessing UITableViewCell Created in Interface Builder .xib File 【发布时间】:2013-07-01 19:39:28 【问题描述】:

在我的 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 ...”来解决这个问题,但我觉得我应该能够在没有的情况下访问单元这样做。

谁能看出我做错了什么?

【问题讨论】:

你有 normalCell 和 endCell 在同一个 nib 文件吗? 没有,但我在与 endCell 相同的 nib 文件中有其他对象 【参考方案1】:

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

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

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

[tableView dequeueReusableCellWithIdentifier:@"YourReuseIdentifier"]

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

【讨论】:

小修正,函数是[self.tableView registerNib:[UINib nibWithNibName:@"EventCell" bundle:nil] forCellReuseIdentifier:@"EventCell"]; @CedricSoubrie:你是对的,感谢修复它!

以上是关于难以访问在 Interface Builder .xib 文件中创建的 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

在 Interface Builder 中访问 NSMutableDictionary 值

如何在 Interface Builder 中存储键/值并在运行时访问它们?

如何使用 Interface Builder 中的自定义 UITableViewCell?

iOS - Interface Builder Outlets 未初始化

有没有办法在Interface Builder中为Auto Layout Constraints添加标识符?

具有 Interface Builder 用户定义的运行时属性的本地化字符串