2012-04-03 60 views
21

用故事板,静态细胞,cellForRowAtIndexPath:故事板静态细胞:dequeueReusableCellWithIdentifier返回nil

UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

总是返回nil

我已经检查了以下内容:

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

我的视图控制器是UITableViewController一个子类,当然,包裹成在一个情节串连图板特设导航控制器。怀疑我的视图控制器不知道故事板中定义的单元格标识符,因为它可能是另一个实例,这里是“实例化”它的代码。在prepareForSegue:,我用

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

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

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

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

+0

您将不得不向我们展示您实际处理创建自定义单元格的位置。这是重要的部分。 – borrrden 2012-04-03 13:12:43

+0

我在故事板中创建自定义单元格。键入“自定义”和它自己的单元标识符。它不是那样工作吗? – Mundi 2012-04-03 14:02:58

+0

我错过了整个静态部分。静态单元完全在故事板中设计。见这个优秀教程的第2部分www.raywenderlich.com/5191/beginning-storyboards-in-ios-5-part-2 – borrrden 2012-04-03 14:11:32

回答

44

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

如果你想获得一个指向一个特定的细胞:使用cellForRowAtIndexPath:

  • 从表中获取该对象

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

  • 迭代通过细胞和检查reuseIdentifier属性,让你感兴趣的细胞。

所有的这些东西都可以在viewWillAppear中或类似的工作要做。

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

+0

谢谢 - 所以为了我想要做的事情,似乎我确实需要使用原型单元格。你可以在你的答案中加上这个,所以我可以检查它吗?感谢您的澄清! – Mundi 2012-04-03 13:22:08

+0

编辑我的答案,你实际上没有说你想做什么,所以希望它有帮助! – jrturton 2012-04-03 13:30:48

+0

我试图在一些单元格中使用静态标题标签和可编辑文本字段,而其他一些控件则使用其他控件。我认为你可以将数据动态地填充到静态单元格中。单元格的数量或位置不变。我已经开始用原型单元来做这件事了,它的工作量非常大 - 几乎比故事板还要糟糕! – Mundi 2012-04-03 13:57:09

0

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

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

干杯,谢谢大家的帮助。

+0

你是如何使用“Custom”Cell的?因为dequeueReusableCellWithIdentifier返回nil? – 2014-04-04 05:31:45

+0

您可以在Interface Builder中指定“自定义”。 – Mundi 2014-04-04 11:15:32

+0

我确实在Interface Builder中指定了Custom,然后我将UITableViewCell分类并分配给它。但它带来了空虚的动态细胞。 – 2014-04-05 01:31:25

0

不同的上述回答,

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

将无法​​正常工作。但是提到的创建cell插座的方法正在工作。

也可以在cell上放置视图,例如UIButtonsUITextFields,并且也有这些视图。

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

0

在故事板中,Static Cells不能实现<UITableViewDataSource>协议中的方法。

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

0

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

如果要修改细胞与数据源的方法,里面cellForRowAtIndexPath:

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

,然后开始修改单元格。

相关问题