故事板中 tableviewController 中的原型 tableview 单元格
Posted
技术标签:
【中文标题】故事板中 tableviewController 中的原型 tableview 单元格【英文标题】:Prototype tableview cell in a tableviewController in a storyboard 【发布时间】:2014-08-22 23:54:02 【问题描述】:我有一个最初不是故事板应用程序的应用程序。我已经为一个特性分支添加了一个故事板,上面有一个UITableViewController
的子类。我创建了一个包含多个UILabels
和UIImageViews
的原型单元,并为每个单元添加了标签。原型单元格具有正确的标识符。
我已经用标识符注册了这个类:
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"CustomCell"];
当我尝试将自定义单元格出列并访问其视图时:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell" forIndexPath:indexPath];
UIImageView *icon = (UIImageView *)[cell viewWithTag:1];
视图(图标)为零。
我也尝试过对其进行子类化,并使用重用标识符注册子类,并在原型中使用子类名称设置UITableViewCell
。在这种情况下,
UIImageView *icon = cell.icon;
仍然返回 nil。
故事板不是主要的有什么关系吗?我有其他项目,其中带有自定义subviews
的原型单元工作正常,没有所有这些麻烦。有没有办法用自定义标识符注册自定义类或UITableViewCell
,但指定它来自哪个故事板?
【问题讨论】:
如果您在情节提要中使用原型单元格,则无需注册该类。只需确保在原型单元中正确设置自定义类并分配 IBOutlets。 您是否尝试过使用[cell.contentView viewWithTag:1]
?
是的,我用 contentView 也试过了,它也返回 nil。
【参考方案1】:
好的,我想通了,我要回答一下,以便记下我学到的一些小知识。
我的控制器正在使用 alloc/init 而不是
进行实例化[_storyboard instantiateViewControllerWithIdentifier:@".."].
这意味着故事板从未使用过,原型单元从未注册过。
因此,当使用辅助情节提要并以编程方式而不是通过 segue 实例化控制器时,请确保使用 instantiateViewControllerWithIdentifier。
不要注册单元格或注册自定义类:
// don't do this
[self.tableView registerClass:[ClaimsCell class] forCellReuseIdentifier:@"ClaimsCell"];
使用以下方法使单元格出列:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AddClaimCell" forIndexPath:indexPath];
这样,编译器实际上会通知您原型单元尚未连接。不要试图使用旧的 tableview dequeue 调用:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AddClaimCell"];
if (!cell)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CustomCell"];
因为如果您正确连接了故事板,单元格将始终由 forIndexPath: 调用返回。
我选择使用带有视图标签的 UITableViewCell 而不是制作自定义类。但是原型单元格可以设置为自定义的 UITableViewCell 子类,并且各个单元格元素如果在故事板中已经连接,则可以被引用。
实例化一个 UITableViewCell:
UIImageView *icon = (UIImageView *)[cell viewWithTag:1];
UILabel *labelDescription = (UILabel *)[cell viewWithTag:2];
UILabel *labelStatus = (UILabel *)[cell viewWithTag:3];
实例化一个 CustomCell:
UIImageView *icon = cell.iconStatus;
UILabel *labelDescription = cell.labelDescription;
UILabel *labelStatus = cell.labelStatus;
【讨论】:
我想建议你停止使用 viewWithTag 而是为你的 UITableViewCell 使用一个自定义类,你可以在其中使用适当的插座。专用视图子类是实现模型、视图和控制器分离的一个非常重要的部分。 如果单元格行为更加自定义,我通常会这样做,而且看起来最终会变成那样,我将切换到 CustomCell。但是现在单元格的布局与常规字幕样式单元格略有不同,因此没有理由添加一个除了插座之外基本上是空的类。文本和内容在 cellForRowAtIndexPath 中的设置几乎与我设置 cell.textLabel.text 的方式相同。 这是一个完整的答案。我很惊讶它没有得到更多的支持。尽管标签对我有用,但它在设置它们时会导致问题。它真的不值得。最好使用您在下面描述的自定义类。以上是关于故事板中 tableviewController 中的原型 tableview 单元格的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSNotifications 从 TableViewController 导航回 UIViewController
如果 UINavigationController 在第一个故事板中,有没有办法在第二个故事板中显示 UINavigationController?