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

21

使用storyboard和静态单元格,在cellForRowAtIndexPath:中的这一行

UITableViewCell *cell = 
   [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

始终返回 nil

我已经检查了以下内容:

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

我的视图控制器是 UITableViewController 的子类,当然,在 storyboard 中它被包装在一个 特设的 导航控制器中。我怀疑我的视图控制器可能不知道在 storyboard 中定义的单元格标识符,因为它可能是另一个实例,下面是“实例化”它的代码。 在 prepareForSegue: 中,我使用

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

在这里进行的视图控制器的其他自定义(设置属性等)都很好用。

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

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


你需要向我们展示你实际处理创建自定义单元格的部分,那是最重要的部分。 - borrrden
我在Storyboard中创建了自定义单元格。输入“Custom”和它自己的单元格标识符。这样行不行? - Mundi
我错过了整个静态部分。静态单元格完全是在故事板中设计的。请参见这个出色的教程的第2部分www.raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2。 - borrrden
我经历过这个。为什么它返回nil? - Mundi
因为你不能在静态故事板中使用它 :). 那种方法适用于原型样式。 - borrrden
6个回答

44

对于表视图中的静态内容,您不需要实现任何数据源方法(包括tableView:cellForRowAtIndexPath:),因此您永远不会出列单元格。对于静态内容,没有出列(至少您无法介入)。

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

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

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
  • 可以通过特定单元格的出口直接进行自定义。

  • 遍历单元格并检查reuseIdentifier属性,以获取您感兴趣的单元格。
  • 这些任何一项都可以在viewWillAppear或类似方法中完成。

    如果您希望单元格中具有完全不同于Storyboard上的内容,则静态单元格可能不是正确的选择。您应该改用动态原型(请注意,您可以在Storyboard中拥有多个原型),并使用传统的数据源方法。


    谢谢 - 所以对于我想做的事情,似乎我真的需要使用原型单元格。你能把这个加到你的答案里吗,这样我就可以检查一下了吗?感谢您的澄清! - Mundi
    修改了我的回答,因为你实际上没有说你想做什么,希望能有所帮助! - jrturton
    我正在尝试在某些单元格中拥有静态标题标签和可编辑文本字段,以及其他控件在其他单元格中。我认为您可以将数据动态填充到静态单元格中。单元格的数量或位置不会改变。我已经开始使用原型单元格进行操作,但这是一项非常繁琐的工作 - 几乎比故事板之前更糟糕! - Mundi
    目前先设为8,未来可能会变成24。我仍然不明白为什么使用静态单元格时单元格返回为空。我也不明白为什么原型单元格中的文本字段不可见。 - Mundi
    关于具有混合静态和动态内容的表视图,如此处所讨论的特殊情况怎么样? - Drux
    显示剩余2条评论

    1
    你仍然可以使用静态UITableView的dataSource/delegate方法,只是不需要创建新单元格。
    如果你想使用dataSource方法修改单元格,在cellForRowAtIndexPath:内部:
    UITableViewCell * cell = [super tableView:tableView cellForRowAtIndexPath:indexPath];
    

    然后开始修改单元格。


    0
    与上面的答案不同,
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    

    这种方法不起作用。但是创建一个指向cell本身的outlet的方法是有效的。

    还可以在cell上放置诸如UIButtonsUITextFields之类的视图,并为它们设置outlet。

    这两种方法也可以结合使用。例如,为特定单元格设置cell.textLabel.text并拥有另一个控件,该控件将从控件的outlet中访问。


    0
    在Storyboard中,静态单元格无法实现<UITableViewDataSource>协议中的方法。
    因此,您可以使用包含在<UITableViewDelegate>中的方法。

    0

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


    0
    解决方案是使用原型单元格而不是静态单元格。我仍然将检查交给@jrturton,因为他是第一个给我这个想法的人。
    我刚刚解决了另一个有趣的错误:对于类型为“自定义”的原型单元格,如果您尝试使用文本填充cell.textLabel,它将自动工作,但是所有其他子视图的行为都非常奇怪。我现在只使用我的自定义标签,一切都正常。
    谢谢大家的帮助。

    你是如何使用“自定义”单元格的?因为dequeueReusableCellWithIdentifier返回了nil? - Mazen Kasser
    您可以在Interface Builder中指定“自定义”。 - Mundi
    我在Interface Builder中指定了Custom,然后我对UITableViewCell进行了子类化,并将其分配给了这个单元格。但它带来了空的动态单元格。 - Mazen Kasser
    听起来你没有正确配置它们。 - Mundi

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接