【问题标题】:dequeueReusableCellWithIdentifier always returns nil (not using storyboard)dequeueReusableCellWithIdentifier 总是返回 nil(不使用情节提要)
【发布时间】:2012-11-02 23:48:18
【问题描述】:

我正在使用重用标识符以编程方式创建单元格。

注意 - 我没有使用故事板来创建单元格

每当cell出队时,cell都是nil,所以需要使用alloc重新创建cell,成本高。

编辑(增加了 1 个问题并更正了代码)

问题

  • 为什么这个出队总是返回 nil ?我该如何纠正?
  • 只有与情节提要/nib 文件一起使用时,出队才有效吗?

代码

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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(!cell) //Every time cell is nil, dequeue not working 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    }

    return cell;
}

【问题讨论】:

  • 它返回 nil 的频率是多少?在您的设备屏幕上同时显示多少个单元格?重用意味着只重用那些刚刚从屏幕上滚动出来的单元格。
  • 斯里卡是对的。必须在新创建的单元格上设置适当的单元格标识符。
  • 它总是返回 nil。在给定时间显示 4 个单元格,当我滚动出队时返回 nil。

标签: objective-c ios uitableview deque


【解决方案1】:

您需要先将CellIdentifier 设置为Cell。你这样做吗?当您创建一个新单元格时,您需要将此标识符 Cell 分配给它。只有这样 iOS 才能使用该标识符dequeueReusableCellWithIdentifier。以编程方式你可以这样做 -

UITableViewCell *cell = [[UItableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"Cell"];

您也可以从 Interface Builder 中设置标识符 -

【讨论】:

  • 我没有使用情节提要,我正在以编程方式创建单元格。所以我认为这个解决方案可能不适用。如果我错了,请纠正我
  • 嘿伙计,我为两者提供了解决方案。请正确阅读答案。首先我给出了程序化解决方案,然后为了完整起见也提供了 IB 解决方案。
  • 抱歉,NSString CellIdentifier 设置为@"Cell"。请注意,原始代码现已更新。我正在这样做,它存在于我粘贴的代码中。如果我遗漏了什么,你能告诉我吗?还是不行。
【解决方案2】:

我犯了几个错误:

  1. 我使用的是 UITableViewController 的子类,但在子类之外创建 tableView
  2. 在表格视图控制器中创建了一个tableView,即self.tableView
  3. 另外,确保单元标识符声明为static

    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    

由于tableViewself.tableView 代表不同的表,单元格没有从同一个表中出列,因此始终为nil

【讨论】:

  • 第2点。为了完全消除歧义,我将nib中的tableView命名为mTableView
【解决方案3】:

此代码应该生成警告“控制到达非无效函数的末尾”,因为您实际上并没有返回任何内容。在函数末尾添加return cell;。此外,您永远不会将重用标识符添加到新创建的单元格中。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";    
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    return cell;
}

【讨论】:

  • 粘贴代码时我错过了几行,现在我已经编辑和更新了。您粘贴的代码是我正在使用的。然而它每次都返回 nil。
【解决方案4】:

首先在 viewDidLoad 方法中为 tableViewCell 声明 单元格标识符

[tableView registerClass:UITableViewCell.class forCellReuseIdentifier:@"MyCell"];

现在回忆具有相同标识符 "MyCell" 的 UITableViewCell 实例:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath];

进一步填充单元格.. 现在逻辑执行有限数量的单元格能够有效地显示非常大的列表(使用出队概念)。

但请记住为单元格中使用的每个 UIView 分配值(如果需要,甚至为 nil),否则会发生覆盖/重叠文本/图像。

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多