iPhone-如何在自定义UITableView单元格和CellWithIdentifier中使用Storyboard

13

我正在尝试使用新的Storyboard设计器,并尝试不再像以前那样通过编程方式“设计”每一行,而是利用它来绘制UITableView单元格。

在stack overflow上有一个标准单元格的好例子: iPhone - dequeueReusableCellWithIdentifier用法

与链接中使用“[cell textLabel]”的方法不同,我想在每行的顶部使用自己的标签、按钮和图像。因此,我创建了几个原型单元格/行并为它们分配了标识符(使用Storyboard)。

现在,最聪明的访问每一行“自定义”控件/标签的方法是什么?我尝试搜索按ID访问它们,但没有找到任何东西。我的想法是它应该沿以下方式工作:

[[[cell subviews] getObjectByID:@"labelTime"] setText:@"Whatever"];

我的API期望完全错了,还是我没找到合适的API?

有什么想法或建议吗?

4个回答

31

对于在Storyboard中创建的每个新自定义的UITableViewCell,你需要创建一个新的类文件来实现UITableViewCell并将其链接起来。确保将在Storyboard中布置的所有控件映射到实例属性。然后,你只需像正常情况下一样使用dequeue即可:

YourTableViewCellClass *cell = (YourTableViewCellClass*)[tableView dequeueReusableCellWithIdentifier:@"YourCellIdentifierStringDefinedInStoryBoard"];
// then set the properties for the class.
cell.labelTime = @"whatever";

打击了我,这几乎太简单了! - Peter Branforn
是的,我只是在一周左右前意识到了这种用法,发现它非常好用和快捷。 - mservidio
完美的..感谢这个想法。 - Kumar KL

8

有两种方法可以访问您的自定义子视图。较简单的方法是使用标签。每个视图都有一个tag属性,该属性是一个整数。您可以在nib中设置标签,并在代码中设置或获取它。您可以通过将viewWithTag:发送到树的根来搜索具有给定标签的视图树。例如,您可以为您的labelTime视图设置标签57,在您的代码中,您可以像这样找到该视图:

UILabel *label = (UILabel *)[cell viewWithTag:57];

使用标签的缺点是你需要保持nib和代码中的标签号码同步。如果它们不同步,你要么得到错误的视图,要么得到nil(由于你可以向nil发送消息,所以当发生这种情况时系统不会给出错误)。尽管如此,标签非常方便,因此通常会像这样使用它们。
另一种方法是创建一个UITableViewCell的自定义子类,并为每个自定义子视图创建一个IBOutlet属性。你可以在nib中连接这些outlets到子视图,然后通过代码中的属性访问这些子视图:
MyTableViewCell *myCell = (MyTableViewCell *)cell;
UILabel *label = cell.labelTime;

这意味着比使用标签需要写更多的样板代码,但它有一个优点,即如果您的nib和代码不同步,您将得到警告或错误(在编译时或首次尝试加载nib时)。


1
如果有人试图使用这种方法,请记住很难理解viewWithTag:57的含义。更好的方法是子类化UITableViewCell。 - Enrico Susatyo

6
不要像我一样傻瓜般行事。 :)
在自定义单元格的属性检查器中设置标识符值。在标识检查器中设置自定义单元格的恢复ID是错误的方法,而这正是我所做的。对于我而言,这是一个重大的失误。

0

如需更多关于如何实现的细节,请使用 mservidio 和 rob 描述的方法,参阅 this tutorial 中的“设计我们自己的原型单元”部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接