为什么将“viewWithTag”与“dequeueReusableCellWithIdentifier”一起使用?

时间:2010-09-03 02:22:49

标签: ios iphone uitableview

有人可以解释为什么你应该使用viewWithTagUILabel中的单元格获取子视图(例如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中设置)。

有人可以告诉我哪种方法更受欢迎,为什么?

谢谢!

6 个答案:

答案 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项目添加额外的类文件。