有人可以解释为什么你应该使用viewWithTag
从UILabel
中的单元格获取子视图(例如dequeueReusableCellWithIdentifier
等)吗?
一些背景信息:我有一个自定义UITableViewCell
,里面有几个UILabel
(我在下面复制了一个简单的版本)。这些标签在关联的NIB文件中定义,并使用IBOutlet
声明并链接回自定义单元的控制器类。在tableview的dequeueReusableCellWithIdentifier
中,我这样做:
CustomCell *customCell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"];
if (customCell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"customCell" owner:self options:nil];
for (id oneObject in nib)
if ([oneObject isKindOfClass:[CustomCell class]])
customCell = (CustomCell *)oneObject;
}
customCell.firstLabel.text = @"Hello";
customCell.secondLabel.text = @"World!";
return customCell;
一切正常。然而,从我看过的教程中,看起来在更改标签的值时,我应该这样做:
UILabel *firstLabel = (UILabel *)[customCell.contentView viewWithTag:555];
firstLabel.text = @"Hello";
UILabel *secondLabel = (UILabel *)[customCell.contentView viewWithTag:556];
secondLabel.text = @"World!";
(标签的标签值已在NIB中设置)。
有人可以告诉我哪种方法更受欢迎,为什么?
谢谢!
答案 0 :(得分:13)
viewWithTag:
只是一种快速而肮脏的方式来提取子视图而无需在父级上设置IBOutlet属性,甚至无需创建UITableViewCell子类。
对于非常简单的案例,这是一个可接受的解决方案,这就是viewWithTag:
的用途。但是,如果您要重复使用该单元格,或者希望它具有更易于开发人员的界面,那么您将需要子类化并使用第一个示例中的真实属性。
所以使用viewWithTag:
如果它是你在IB中设计的一个非常简单的单元格,没有子类,只有几个标签。使用具有真实属性的单元子类来获得更实质的内容。
答案 1 :(得分:10)
我已经意识到,如果元素以编程方式添加到单元格中(即未在NIB中定义并通过IBOutlets连接),则使用“viewWithTag”检索元素很有用 - 这样可以防止创建多个标签等对于每个单元格实例。
答案 2 :(得分:4)
对我来说,viewWithTag是上帝赐予的。首先:处理像taskinoor这样的循环中的所有视图说真的很容易。另外,我个人更喜欢这种方式,因为如果我查看代码并想看看视图会发生什么,我只需搜索标记。在处理视图的任何地方都使用它。反对xib方法,你必须查看代码和xib。此外,如果你在xib中有一个屏幕外视图,你可能会监督它。 我发现很多其他程序员制作的xib都很多,有很多很多观点。一些隐藏的,一些屏幕外的,无法分辨出哪些是重叠的。 在那些情况下,我认为xib是坏的。它们不再容易阅读。 我更喜欢用代码制作的所有内容。
但是如果您决定使用标签,请记住避免对任何标签进行硬编码。而是制作#define定义列表以保持代码清洁和可读。
答案 3 :(得分:1)
我总是通过IBOutlets将子视图挂钩到我的UITableViewCell子类的属性,就像你所做的那样。我想不出任何使用viewWithTag的理由。
答案 4 :(得分:0)
来自UITableViewCell类参考:“tableView中的表视图委托:cellForRowAtIndexPath:在重用单元格时应始终重置所有内容。”保持简单,清除内容视图。这不会假设自定义单元格类,没有演员表,没有类检查:
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
if (cell != nil)
{
NSArray* contentSubViews = [cell.contentView subviews];
for (UIView* viewToRemove in contentSubViews)
{
[viewToRemove removeFromSuperview];
}
}
答案 5 :(得分:0)
viewWithTag:
允许样式而无需创建UITableViewCell
的自定义子类。
您可以在Interface Builder中为原型UITableViewCell
分配标记和重用标识符,然后在UITableViewController
的实现中使用该标记对该视图进行出列和修改,而无需为其创建自定义类单元格或为单元格的子视图创建IBOutlets。
在某些情况下,单元格的简单性使得自定义类感觉有点过分。 viewWithTag:
允许您将自定义文本和图像添加到Storyboard中的单元格,然后通过代码设置这些自定义,而无需向Xcode项目添加额外的类文件。