UITableViewCell样式和dequeueReusableCellWithIdentifier

时间:2013-05-22 02:16:39

标签: ios objective-c uitableview

所以我注册了我的手机:

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    // setting up the cell
}

问题是我无法设置cell.detailTextLabel.text属性。单元格永远不会nil

7 个答案:

答案 0 :(得分:29)

如果首先调用,则表视图registerClass将导致dequeueReusableCellWithIdentifier在单元格重用标识符匹配时返回非零单元格。

我相信registerClass通常用于将是UITableViewCell派生的自定义单元格的单元格。您的自定义单元格可以覆盖initWithStyle并在那里设置样式。

并不总是需要创建自定义单元格。

如果要设置单元格样式,请不要调用registerClass

答案 1 :(得分:11)

您需要执行3次更改才能实现目标:

  1. 删除registerClass语句。
  2. UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; => UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  3. 使用initWithStyle:UITableViewCellStyleSubtitle
  4. 通常有两种方法可以使用subtile创建单元格,首先使用自定义UITableViewCell,在init中设置样式。其次是跟随代码,这是你想要的:

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }
    

答案 2 :(得分:1)

尝试为单元格使用UITableViewCellStyleSubtitle样式。将if语句中的行更改为:

cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

答案 3 :(得分:1)

您需要更改单元格样式:

if (cell == nil) {
                    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

到这个

if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        }

这对你有用。

答案 4 :(得分:1)

最简单的方法是使用故事板,并在IB中设置单元格样式。在这种情况下,您不应该注册任何内容,也不应该有if(cell == nil)子句。您是否使用dequeueReusableCellWithIdentifier:或dequeueReusableCellWithIdentifier:forIndexPath似乎并不重要。当故事板中创建该单元格时,它们都保证返回单元格。

答案 5 :(得分:1)

创建自定义单元格。在界面构建器中更改其样式。使用表视图从视图控制器的nib中注册单元格。

Set the style

代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.tableView registerNib:[UINib nibWithNibName:@"YourCustomCell" bundle:nil] forCellReuseIdentifier:kReuseIdentifier];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    YourCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:kReuseIdentifier];

    // Do things with the cell. 
    // The cell has no chance to be nil because you've already registered it in viewDidLoad method. 
    // So there's not need to write any code like if(cell==nil).
    // Just use it.

    return cell;
}

答案 6 :(得分:0)

这是一个老问题。我只是想提供一种替代解决方案。

注册单元格后,为什么不在下面尝试:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

然后做:

[cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier ];

它对我有用。