为什么使用viewWithTag是有效的?

时间:2013-07-24 22:28:30

标签: ios objective-c

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 个答案:

答案 0 :(得分:10)

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

Mike Keller wrote a post about it

  

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

     

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

     

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

     

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

     

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

答案 1 :(得分:8)

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

它不是真正有效,因为它执行视图层次结构的搜索以查找视图。有效的选择是创建一个单元子类,该子类具有您要访问的视图的属性,然后您可以在不进行任何搜索的情况下获取引用。

答案 2 :(得分:4)

我认为你并不是真的在询问效率,而是询问效率(即为什么这样做)。

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

所以,是的,这是一个很好的技巧:在第一次创建单元格时,指定tag指定单元格中的特定用途的标签,但使用viewWithTag快速识别在重复使用单元格时,在应用程序的稍后点标记。我不会将此描述为效率的目的,只是为了确保您不会在重用的单元格中不必要地创建冗余控件。

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

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

答案 3 :(得分:0)

在您的情况下,在没有看到其余代码的情况下,使用带有UITableView的标记没有多大意义。而且还有其他一些我想纠正的事情。

但是,还有许多其他情况下首选使用标签。在我的情况下,我有一个应用程序,它在运行中创建一些UIViews并将其添加为屏幕上现有UIViews的子视图。我不是在这里和那里得到强有力的参考,而是随时分配并保留一个自定义标签来回忆起UIView。

我认为:

[myView viewWithTag:BACKGROUND_CONSTANT]

非常易读,并且避免让我编写使我的项目膨胀的子类或类扩展。

另外,我理解搜索性能,但是现在与过去(远程过去)相比,设备非常强大,所以不要担心通过工作和任务来强调系统。最佳做法是始终运行探查器(XCode有一个好的),测量并解决问题(如果有的话)。