【问题标题】:UITableView cells not nil at initializationUITableView 单元格在初始化时不为零
【发布时间】:2012-05-02 13:17:38
【问题描述】:

我正在使用故事板编辑器设置我的UITableView。为了创建我的单元格,我使用标准委托方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell"];
        if (cell == nil)
        {
        // Do cell setup
        }
    // etc
    return cell;
}

除非单元格第一次出队,否则它不是零,因为它应该是。所以 if 语句中的代码永远不会被执行。

人们在重用标识符不一致时会收到此错误,因此我继续验证我在故事板视图中使用的重用标识符与我在代码中使用的完全相同。仍然面临这个问题。我在项目中还有几个表视图,每个表视图都有一个唯一的重用标识符。还是没有骰子。有人知道这里还有什么可能出错的吗?

【问题讨论】:

  • 您是否在代码的其他地方(例如,在单独的类中)创建了标识符为 @"SearchResultCell" 的单元格?
  • @titaniumdecoy 大概就是这样,我想不出别的了。我会将此作为答案发布:)
  • 其实我没有,只有tableview委托/数据源类处理这些单元格或者这个重用标识符。

标签: ios ios5 uitableview uistoryboard xcode-storyboard


【解决方案1】:

这不再是 UITableView 的工作方式了。阅读您的问题,我认为您可能对它之前的工作方式也感到困惑。如果没有,抱歉,本文的第一部分只是回顾。 :)

没有故事板单元原型

它曾经是这样工作的:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    // If the tableview has an offscreen, unused cell of the right identifier
    // it will return it.
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell"];
    if (cell == nil)
    {
        // Initial creation, nothing row specific.
    }

    // Per row setup here.

    return cell;
}

当您使用重用标识符创建单元格时,您在此处进行初始设置。没有特定于该特定行/索引路径的内容。

在我放置 每行设置 注释的地方,您有一个正确标识符的单元格。它可能是新鲜的电池,也可能是回收的电池。您负责与此特定行/索引路径相关的所有设置。

示例:如果您在某些行中设置了文本(可能),您需要在所有行中设置或清除它,否则您设置的行中的文本会泄漏到您没有设置的单元格中。

使用故事板原型

不过,对于故事板,故事板和表格视图会处理初始单元格的创建!这是很棒的东西。使用情节提要时,您可以直接在 tableview 中绘制单元原型,Cocoa Touch 将为您完成初始创建。

相反,你会得到这个:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell"];
    // You'll always have a cell now!

    // Per row setup here.

    return cell;
}

您负责与以前一样的每行设置,但您不需要编写代码来构建初始空单元格,无论是内联还是在其自己的子类中。

正如 Ian 在下面指出的,您仍然可以使用旧方法。只需确保不要在情节提要中为您指定的标识符包含单元原型。视图控制器将无法从单元原型构建您的单元,dequeueReusableCellWithIdentifier 将返回 nil,您将回到原来的位置。

【讨论】:

  • 我能否使用代码而不是 IB 来创建我的单元原型?
  • 你仍然可以使用旧的方式;只是不要制作具有相同标识符的原型单元。
  • 我认为,如果您在情节提要中包含原型,则可以返回 nil。但我从未真正尝试过:这个新的 tableview 是我最喜欢的 iOS 5 功能。 :)
  • 如果您在 Xcode 中遇到崩溃,可能是索引器或 Xcode 的支持无线连接设备。关闭 Xcode 的无线支持(Preferences,General 选项卡),退出 Xcode,并删除派生数据目录(~/Library/Developer/Xcode/DerivedData)。这对你来说应该是更好的体验。 (大概是因为这个原因,在 4.3.1 中删除了无线支持。)
  • @AndrewLauerBarinov 你应该接受这个答案;这对未来有同样问题的人会更有帮助。如果需要,您可以对其进行编辑以包含我的评论。
猜你喜欢
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多