故事板中 tableviewController 中的原型 tableview 单元格

Posted

技术标签:

【中文标题】故事板中 tableviewController 中的原型 tableview 单元格【英文标题】:Prototype tableview cell in a tableviewController in a storyboard 【发布时间】:2014-08-22 23:54:02 【问题描述】:

我有一个最初不是故事板应用程序的应用程序。我已经为一个特性分支添加了一个故事板,上面有一个UITableViewController 的子类。我创建了一个包含多个UILabelsUIImageViews 的原型单元,并为每个单元添加了标签。原型单元格具有正确的标识符。

我已经用标识符注册了这个类:

[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?

在故事板中隐藏导航栏

故事板中的 UITableView

当多个tableViewControllers(没有故事板)时如何pushViewController

故事板中的当前选项卡