dequeueReusableCellWithIdentifier 总是返回 nil

Posted

技术标签:

【中文标题】dequeueReusableCellWithIdentifier 总是返回 nil【英文标题】:dequeueReusableCellWithIdentifier always returns nil 【发布时间】:2014-05-13 14:09:12 【问题描述】:

我有一个包含 6 个单元格和几个部分的静态表格。当我初始化一个单元格时,它总是返回 nil,尽管我在传递的过程中使用了这个完全相同的方法......

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

    if (indexPath.section == SAVE_SECTION) 
        ATSaveCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SaveCell"];
        if(cell == nil) 
            NSLog(@"nil cell");
            cell = [[ATSaveCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SaveCell"];
        
        cell.textLabel.text = @"test";
        return cell;
     

nil 单元总是输出。在我的故事板中,我有一个 tableviewcontroller 定义了单元格,id 是“SaveCell”。我还检查以确保表 ciew 控制器与我正在工作的类是同一个类...我在传递中使用了完全相同的方法,所以我不确定为什么单元格每次都返回 nil。

另外,初始化我的tableviewcontroller:

ATSearchSettingsViewController *mySearchSettings = [sb instantiateViewControllerWithIdentifier:@"SearchSettings"];

很明显,表格视图没有在情节提要中注册原型单元格。

【问题讨论】:

如果没有足够的单元格容纳视图,它将始终创建一个新单元格。您不能重复使用仍然可见的单元格。 尝试添加 [self.tableView registerClass:[ATSaveCell class] forCellReuseIdentifier:@"SaveCell"];在 viewDidLoad @WilliamGeorge 这可能是一个答案,而不仅仅是评论 @wootage 这可以防止崩溃,但单元格与我在情节提要中制作的原型不同。 @WilliamGeorge 我只返回 1 个单元格。 【参考方案1】:

如果问题是 UITableView 没有从故事板中取出单元格。尝试检查您使用的是prototype cells 而不是static cells。 UITableView 不会将静态单元格出列。

如果问题是您总是打电话给[[ATSaveCell alloc] init]。如果表视图没有任何可重用的内容,则需要这样做。

来自文档:dequeueReusableCellWithIdentifier

如果一个现有单元格可用,此方法会使现有单元格出列或创建一个 使用您之前注册的类或 nib 文件新建一个。如果不 单元格可重复使用,并且您没有注册类或 nib 文件,此方法返回 nil。

因此,如果没有足够的单元格容纳视图,它将始终创建一个新单元格。

【讨论】:

以上是关于dequeueReusableCellWithIdentifier 总是返回 nil的主要内容,如果未能解决你的问题,请参考以下文章