1
static NSString *cellID = @"Cell Identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

if (!cell)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    [cell.contentView setBackgroundColor: [UIColor clearColor]];

    UIImage * box = [UIImage imageNamed: @"box.png"];
    UIView * cellbackgroundview = [[UIView alloc] initWithFrame: CGRectMake(7, 0, box.size.width, box.size.height)];
    [cellbackgroundview setBackgroundColor: [UIColor colorWithPatternImage: box]];

    UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake( 0, 15, box.size.width, 19.0f)];
    nameLabel.text = name;
    [nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]];
    [nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]];
    [nameLabel setBackgroundColor: [UIColor clearColor]];
    nameLabel.textAlignment = NSTextAlignmentCenter;
    nameLabel.tag = 1;
    .....

}

((UILabel *)[cell viewWithTag:1]).text = name;
((UILabel *)[cell viewWithTag:2]).text = pitch;

为什么像我上面那样使用 viewWithTag 是有效的?

4

4 回答 4

13

我不同意答案。我认为使用标签通常不是一个好习惯,在你的情况下,这只是懒惰。您应该创建一个UITableViewCell子类,并将标签作为属性。

迈克凯勒写了一篇关于它的帖子

假设您没有尝试将数据存储在视图的标签中。相反,您只需要一种快速而肮脏的方式来获取对视图的引用。在这些情况下可以使用标签吗?

好吧,在我能想到的几乎所有情况下,最好在某处使用真实属性存储对视图的引用,无论是 IBOutlet 还是您类上的常规属性。

您是否需要向 UITableViewCell 添加一些自定义视图?子类化它并添加真实属性。(...)

通过使用真实属性,您可以获得更强大的键入、更好的命名、更好的应用程序移动部分的可见性,并且您不必向下转换 viewWithTag 的 UIView* 返回类型。您还可以获得更好的性能,因为 viewWithTag: 必须遍历每次调用的视图层次结构。

对我来说,使用标签似乎是另一种纯粹由懒惰驱动的模式。

于 2013-07-25T04:54:54.953 回答
9

谁说效率高?在什么情况下?

它不是很有效,因为它执行视图层次结构的搜索以找到视图。有效的选择是创建一个单元子类,它具有您要访问的视图的属性,然后您无需任何搜索即可获得参考。

于 2013-07-24T22:37:02.600 回答
4

我假设您并不是真正询问效率,而是询问功效(即为什么要这样做)。

如果单元格已成功出列/重用,则您正在使用viewWithTag,因此您仍然可以访问UILabel您在首次创建单元格时添加的适当对象。您这样做是出于功能原因(因为您不想重新添加已在重用单元格中的控件)。

所以,是的,这是一个很好的技术:tag当第一次创建单元格时,分配 a 来指定一个标签用于单元格中的特定目的,但是viewWithTag当单元格被重用时,用于在应用程序中的稍后位置快速识别该标签. 我不会将其描述为为了提高效率而这样做,而只是为了确保您不会在重复使用的单元格中不必要地创建冗余控件。

值得注意的是,虽然这种技术在几年前并不少见,但现在有更优雅的方法可以tag通过使用故事板单元原型和子类来消除神秘数字并产生更清晰的代码UITableViewCell

但是你的技术没有问题。只是它通常不会被认为特别有效,而且现在,代码易读性的原因可能会让人们倾向于其他方法。

于 2013-07-24T22:36:29.970 回答
0

在你的情况下,没有看到你的代码的其余部分,使用带有 UITableView 的标签没有多大意义。还有一些其他的事情我会纠正。

但是,还有许多其他情况下首选使用标签。在我的情况下,我有一个应用程序正在动态创建一些 UIViews 并将它们添加为屏幕上现有 UIViews 的子视图。与其在这里和那里获得强大的参考,我只是分配并保留一个自定义标签以随时调用 UIView。

我觉得:

[myView viewWithTag:BACKGROUND_CONSTANT]

可读性很强,并且避免我编写使我的项目膨胀的子类或类扩展。

另外,我了解性能的搜索,但现在与过去(遥远的过去)相比,设备非常强大,所以不要担心给系统带来工作和任务的压力。最佳实践是始终运行分析器(XCode 有一个很好的),测量并解决问题(如果有)。

于 2013-07-25T09:28:37.620 回答