dequeueReusableCellWithIdentifier始终返回nil(不使用storyboard)

时间:2012-11-14 13:16:13

标签: objective-c ios uitableview deque

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

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

每当单元格出列时,单元格为零,因此需要使用alloc重新创建单元格,这很昂贵。

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

问题

  • 为什么这个出队总是返回零?我怎样才能纠正它?
  • 只有在与storyboard / 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;
}

4 个答案:

答案 0 :(得分:12)

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

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

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

enter image description here

答案 1 :(得分:11)

我犯了几个错误:

  1. 我使用的是UITableViewController的子类,但是在子类之外创建了tableView
  2. 在表视图控制器中创建了tableViewself.tableView在表视图控制器中返回索引路径的单元格时,我使用的是self.tableView而不是{{1} }}。
  3. 另外,请确保将单元格标识符声明为tableView

    static
  4. 由于static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; tableView代表不同的表,因此单元格未从同一个表中出列,因此始终为self.tableView

答案 2 :(得分:2)

此代码应该生成警告“控制到达非void函数的结尾”,因为您实际上没有返回任何内容。将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;
}

答案 3 :(得分:1)

首先在 viewDidLoad 方法中为tableViewCell声明小区标识符

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

现在回想一下具有相同标识符“MyCell”的UITableViewCell实例:

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

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

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