【问题标题】:Static UITableViewCell returns nil on CellForRowAtIndexPath, but only for certain sections静态 UITableViewCell 在 CellForRowAtIndexPath 上返回 nil,但仅适用于某些部分
【发布时间】:2013-05-18 05:03:05
【问题描述】:

我在 Storyboard 场景中使用静态单元定义了一个表格视图控制器。 表格视图本身包含六个部分,每个部分包含一个或两个单元格。 我在视图控制器中通过此方法将数据写入单元格:

- (void)setUpAllCells
{
    //Charge Name
    NSIndexPath *path = [NSIndexPath indexPathForRow:0 inSection:0];
    TableViewCellTextField *currentTextField = (TableViewCellTextField *)[[self tableView] cellForRowAtIndexPath:path];
    [currentTextField.textField setDelegate:self];

    //Charge Description
    path = [NSIndexPath indexPathForRow:1 inSection:0];
    currentTextField = (TableViewCellTextField *)[[self tableView] cellForRowAtIndexPath:path];
    [currentTextField.textField setDelegate:self];

    ...

    path = [NSIndexPath indexPathForRow:0 inSection:5];
    TableViewCellControl *currentControl = (TableViewCellControl *)[[self tableView] cellForRowAtIndexPath:path];
    [currentControl setValue:m_data->trailBurnTime];
}

调用自:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self setUpAllCells];
}

当我运行应用程序时,除了最后一部分之外,每个单元格都会按预期响应。
最后一部分的单元格未连接到我的控制器,并保留故事板场景中的默认值。我在 setUpAllCells 中设置了一个断点,发现最后一部分的 cellForRowAtIndexPath 返回 nil。

我已将这种格式用于其他五个视图控制器,但没有发生过这种情况。

这是我迄今为止尝试过的:

  • 我使用自己的自定义 TableViewCells 进行了测试,当这些都不起作用时,使用标准 UITableViewCells。最后一部分总是返回 nil。

  • 我重新排列了部分和单元格。最后一部分总是返回 nil。

  • 我完全删除了该部分。没有它,其他部分仍然可以正常工作。

  • 我添加了更多部分。第 5 节中的任何内容在 CellForRowAtIndexPath 处返回 nil。

我在这里不知所措。我不知道是什么原因造成的。

建议?

【问题讨论】:

  • 如果您的表格视图有 6 个部分,那么您在最后一段代码中没有第 6 部分。
  • @rdelmar 哎呀。我打错了。在我的原始代码中是 5。这是我按照问题底部所述进行的测试遗留下来的。

标签: ios cocoa-touch uitableview


【解决方案1】:

我不知道为什么你会得到你所做的结果——当我尝试它并记录单元格时,我只得到了前 3 个部分的有效单元格。任何超过第 2 节的内容都是空的。坦率地说,我不确定它为什么会起作用,因为这不是 Apple 所说的填充静态表格视图的方式。您应该在表格视图控制器中为单元格中的 UI 元素创建 IBOutlets。在这方面,静态表视图更像是带有子视图的滚动视图,而不是表视图。您还可以为单元格本身而不是单个 UI 元素创建 IBOutlets,然后使用点表示法来处理自定义单元格中的任何属性,或者像 textLabel 和 detailTextLabel 这样的标准属性。

【讨论】:

  • 是的,就是这样。我删除了对 CellForRowAtIndexPath 的调用,并为我的单元格创建了 IBOutlets。现在,一切正常。我相信它对大多数细胞起作用的原因是它们在屏幕上。也就是说,只有加载视图时屏幕下方的单元格不起作用。我认为这是因为表格视图最初只加载可见单元格。因此,当我尝试使用 CellForRowAtIndexPath 访问单元格时,没有超出第六部分的数据。
【解决方案2】:

关于您的问题的有趣故事是,当您在 tableview 上调用函数 cellForRowAtIndexPath 时,我相信它会依次调用您应该作为 UITableViewDelegate 实现的委托回调函数,该函数为 TableView 提供 cellForRowAtIndexPath。

一旦您实现了该功能,您将获得该单元格。我认为您正在寻找的功能是:

– dequeueReusableCellWithIdentifier:forIndexPath:
– dequeueReusableCellWithIdentifier:

看这里:http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html

我知道这不太可能是您正在寻找的答案,但它是事实:)。

【讨论】:

  • 这些是表格视图方法。我正在创建一个自定义表格视图控制器,而不是一个表格视图。由于我没有覆盖基本实现,我认为我不需要这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多