9

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

注意- 我没有使用情节提要来创建单元格

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

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

问题

  • 为什么这个出队总是返回 nil ?我该如何纠正它?
  • 出队是否仅在与故事板/笔尖文件一起使用时才起作用?

代码

- (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

4 回答 4

12

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

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

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

在此处输入图像描述

于 2012-11-14T13:24:48.420 回答
11

我犯了几个错误:

  1. 我正在使用的子类UITableViewController,但是在子类之外创建 tableView
  2. tableView在表格视图控制器中创建了一个,它在表格视图控制器中返回self.tableView索引路径的单元格时,我使用self.tableView的是tableView.
  3. 此外,请确保将单元标识符声明为static

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

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

于 2012-11-14T21:25:17.977 回答
2

此代码应该生成警告“控制到达非无效函数的结尾”,因为您实际上并没有返回任何内容。添加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;
}
于 2012-11-14T13:45:18.740 回答
1

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

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

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

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

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

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

于 2015-04-29T13:03:40.863 回答