Storyboard静态单元格:dequeueReusableCellWithIdentifier返回nil

cellForRowAtIndexPath:使用storyboard,静态单元格cellForRowAtIndexPath:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

总是返回nil

我检查了以下内容:

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

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

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

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

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

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

在静态内容的表格视图中,你不需要实现任何的数据源方法(包括tableView:cellForRowAtIndexPath:所以你永远不会出列这些单元格,也不会出现静态内容的列表(你可以参与进来)。

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

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

     UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
  • 有一个特定的细胞出口,并直接定制它。

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

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

如果你想在你的单元格中有完全不同的内容,那么静态单元格可能不是正确的select。 您应该使用dynamic原型(注意故事板中可以有多个原型),而使用传统的数据源方法。

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

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

干杯,谢谢大家帮忙。

与上面的答案不同,

 UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

不pipe用。 但提到的方法来创buildcell本身的出口正在工作。

还可以在cell放置诸如UIButtonsUITextFields视图,并且还可以有这些视图。

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

在故事板中,静态单元不能实现<UITableViewDataSource>协议中的方法。

所以你可以使用包含在<UITableViewDelegate>

你仍然可以使用静态UITableView dataSource /委托方法,你不需要创build新的单元格。

如果你想用dataSource方法修改单元格,在cellForRowAtIndexPath:

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

然后开始修改单元格。