【问题标题】:Storyboard static cells: dequeueReusableCellWithIdentifier returns nil故事板静态单元格:dequeueReusableCellWithIdentifier 返回 nil
【发布时间】:2012-04-17 03:08:40
【问题描述】:

使用情节提要,静态单元格,在cellForRowAtIndexPath:

UITableViewCell *cell = 
   [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

总是返回nil

我已经检查了以下内容:

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

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

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

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

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

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

【问题讨论】:

  • 您必须向我们展示您实际处理创建自定义单元格的位置。这是重要的部分。
  • 我在情节提要中创建了自定义单元格。键入“自定义”及其自己的单元格标识符。这样不行吗?
  • 我错过了整个静态部分。静态单元完全在情节提要中设计。请参阅本优秀教程的第 2 部分 www.raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2
  • 我经历过。为什么它返回 nil?
  • 因为你不能将它与静态故事板一起使用:)。该方法适用于原型样式。

标签: iphone ios ios5 uitableview storyboard


【解决方案1】:

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

如果你想获得一个指向特定单元格的指针:

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

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    
  • 有一个特定单元的出口并直接对其进行自定义。

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

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

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

【讨论】:

  • 谢谢 - 所以对于我想做的事情,我似乎真的需要使用原型单元。您能否将其添加到您的答案中,以便我检查一下?感谢您的澄清!
  • 编辑了我的答案,你实际上并没有说出你想要做什么,所以希望它有所帮助!
  • 我正在尝试在某些单元格中使用静态标题标签和可编辑文本字段,并在其他单元格中使用其他一些控件。我认为您可以将数据动态填充到静态单元格中。单元格的数量或位置不会改变。我已经开始用原型单元来做这件事,而且工作量很大——几乎比以前的故事板更糟糕!
  • 每个可编辑文本字段都有一个出口。十分简单。我自己为设置类型屏幕完成了此操作。
  • 这是一项疯狂的工作!它必须比这更简单。我正在填写自定义对象的属性,因此可能需要处理大量数据,但主要是文本字段中的文本。另外,这不适用于原型单元。 - 另外,我刚刚意识到,由于某种原因,文本字段是不可见的......故事板的噩梦!
【解决方案2】:

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

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

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

然后开始修改单元格。

【讨论】:

    【解决方案3】:

    解决方案是使用原型单元而不是静态单元。我仍然把支票交给@jrturton,因为他是第一个让我有这个想法的人。

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

    干杯,感谢大家的帮助。

    【讨论】:

    • 您是如何使用“自定义”单元格的?因为 dequeueReusableCellWithIdentifier 返回 nil?
    • 您可以在 Interface Builder 中指定“自定义”。
    • 我确实在 Interface Builder 中指定了自定义,然后我将 UITableViewCell 子类化并分配给它这个单元格。但它会带来空的动态单元格。
    • 听起来你没有正确配置它们。
    【解决方案4】:

    与上面的答案不同,

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    

    不会工作。但是上面提到的为cell 本身创建一个出口的方法是有效的。

    还可以在cell 上放置UIButtonsUITextFields 等视图,并为这些视图设置插座。

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

    【讨论】:

      【解决方案5】:

      在情节提要中,静态单元无法实现 <UITableViewDataSource> 协议中的方法。

      所以你可以使用<UITableViewDelegate>中包含的方法。

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2011-12-29
          • 2014-09-27
          • 2016-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-10
          • 1970-01-01
          • 2015-03-06
          相关资源
          最近更新 更多