故事板静态单元格:dequeueReusableCellWithIdentifier返回nil

时间:2012-04-03 12:52:26

标签: iphone ios ios5 uitableview storyboard

cellForRowAtIndexPath:行中使用故事板,静态单元格

UITableViewCell *cell = 
   [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

始终返回nil

我检查过以下内容:

  • 在IB / Storyboard中正确设置了单元格的标识符,我在代码中使用相同的标识符。我多次验证过。
  • 我没有在其他地方实例化视图控制器(这是this stackoverflow question中的问题)。

我的视图控制器是UITableViewController的子类,当然,它包含在故事板中的 ad hoc 导航控制器中。怀疑我的视图控制器以某种方式不知道故事板中定义的单元标识符,因为它可能是另一个实例,这里是代码“实例化”它。在prepareForSegue:中,我使用

CustomViewController *vc = [[[segue destinationViewController] 
   viewControllers] objectAtIndex:0];

此处完成的视图控制器的其他自定义(设置属性等)工作正常。

我正在使用静态单元格,因为部分和行的数量不会改变,并且每个单元格都包含静态文本(以及其他要编辑的控件或文本字段)。

在我看来,这是一项非常常见的任务(在视图控制器的数据源方法中自定义故事板中的静态单元格)。我做错了什么?

6 个答案:

答案 0 :(得分:44)

对于表视图中的静态内容,您不实现任何数据源方法(包括tableView:cellForRowAtIndexPath:),因此您永远不会将单元格出列。静态内容没有出列(您可以参与其中) ,无论如何)。

如果您想获得指向特定单元格的指针:

  • 使用cellForRowAtIndexPath:从表格视图中获取它:

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
  • 有特定单元格的插座并直接自定义。

  • 遍历单元格并检查reuseIdentifier属性以获取您感兴趣的单元格。

任何这些事情都可以在viewWillAppear或类似的事情中完成。

如果您希望单元格中的内容与故事板上的内容完全不同,那么静态单元格可能不是正确的选择。您应该使用传统的数据源方法来使用动态原型(请注意,故事板中可以有多个原型)。

答案 1 :(得分:0)

解决方案是使用原型细胞而不是静态细胞。我还在给@jrturton支票,因为他是第一个给我这个想法的人。

我刚解决的另一个有趣错误:对于“自定义”类型的原型单元格,如果您尝试用文本填充cell.textLabel,它将自动运行,但所有其他子视图的行为都非常奇怪。我现在只使用我的自定义标签,一切正常。

干杯,谢谢大家帮忙。

答案 2 :(得分:0)

与上述答案不同,

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

不起作用。但是,所提到的创建cell本身的出口的方法正在发挥作用。

也可以在UIButtons上放置UITextFieldscell等观点,并为这些观点提供出口。

两种方法也可以组合使用。例如。为特定单元格设置cell.textLabel.text,并从控件出口访问另一个控件。

答案 3 :(得分:0)

在故事板中,静态单元CAN&#39; T实现了<UITableViewDataSource>协议中的方法。

因此,您可以使用<UITableViewDelegate>中包含的方法。

答案 4 :(得分:0)

您仍然可以使用静态UITableView的dataSource / delegate方法,您只需要创建新单元格。

如果要使用dataSource方法修改单元格,请在cellForRowAtIndexPath:

UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];

然后开始修改单元格。

答案 5 :(得分:0)

我知道这是一个非常古老的问题,但处理这个问题的更好方法是使用 tableView(_:willDisplay:forRowAt:)