Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么使用viewWithTag是有效的?_Ios_Objective C - Fatal编程技术网

Ios 为什么使用viewWithTag是有效的?

Ios 为什么使用viewWithTag是有效的?,ios,objective-c,Ios,Objective C,为什么像我上面所做的那样使用viewWithTag是有效的?我想你不是在问效率,而是在问效率,即为什么这样做 如果单元格已成功退出队列/重新使用,则您将使用viewWithTag,这样您仍然可以访问首次创建单元格时添加的相应UILabel对象。您这样做是出于功能原因,因为您不想重新添加已在重用单元中的控件 因此,是的,这是一个很好的技术:当单元格第一次创建时,分配一个标签来指定单元格中用于特定目的的标签,但在以后重用单元格时,使用viewWithTag在应用程序中快速识别该标签。我不会说这是为了

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

我想你不是在问效率,而是在问效率,即为什么这样做

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

因此,是的,这是一个很好的技术:当单元格第一次创建时,分配一个标签来指定单元格中用于特定目的的标签,但在以后重用单元格时,使用viewWithTag在应用程序中快速识别该标签。我不会说这是为了提高效率,而只是为了确保不会在重用的单元中不必要地创建冗余控件

值得注意的是,虽然这种技术在几年前并不少见,但现在有了更优雅的方法,通过使用故事板单元原型和UITableViewCell子类,消除了隐藏的标签号,并产生了更清晰的代码


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

我想你不是在问效率,而是在问效率,即为什么这样做

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

因此,是的,这是一个很好的技术:当单元格第一次创建时,分配一个标签来指定单元格中用于特定目的的标签,但在以后重用单元格时,使用viewWithTag在应用程序中快速识别该标签。我不会说这是为了提高效率,而只是为了确保不会在重用的单元中不必要地创建冗余控件

值得注意的是,虽然这种技术在几年前并不少见,但现在有了更优雅的方法,通过使用故事板单元原型和UITableViewCell子类,消除了隐藏的标签号,并产生了更清晰的代码


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

谁说它有效?在什么情况下


它不是很有效,因为它执行视图层次结构的搜索以查找视图。有效的方法是创建一个单元格子类,该子类具有要访问的视图的属性,然后无需任何搜索即可获得引用。

谁说它有效?在什么情况下


它不是很有效,因为它执行视图层次结构的搜索以查找视图。有效的方法是创建一个单元格子类,该子类具有要访问的视图的属性,然后无需任何搜索即可获得引用。

我不同意这些答案。我认为使用标签一般来说不是一个好的实践,对你来说,这只是懒惰。您应该创建一个UITableViewCell子类,将标签作为属性

迈克·凯勒:

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

好的,在我能想到的几乎所有情况下,最好在某个地方使用不动产存储对视图的引用,无论是IBOutlet还是类上的常规属性

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

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

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


我不同意这些答案。我认为使用标签一般来说不是一个好的实践,对你来说,这只是懒惰。您应该创建一个UITableViewCell子类,将标签作为属性

迈克·凯勒:

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

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

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

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

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


在您的例子中,如果没有看到代码的其余部分,那么使用带有UITableView的标记就没有多大意义。还有一些我想纠正的事情

然而,在许多其他情况下,使用标签是首选的。在我的例子中,我有一个应用程序正在动态创建一些UIView,并将它们添加为屏幕上现有UIView的子视图。我只是分配并保留一个自定义标记,以便随时调用UIView,而不是在这里或那里获取强引用

我认为:

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;
是非常可读的,并且避免我编写会使项目膨胀的子类或类扩展


此外,我了解性能的搜索,但现在与过去相比,远程过去的设备功能相当强大,因此,不要担心系统的工作和任务。最好的做法是始终运行探查器XCode,如果有好的,测量并解决问题(如果有)。

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

然而,在许多其他情况下,使用标签是首选的。在我的例子中,我有一个应用程序正在动态创建一些UIView,并将它们添加为屏幕上现有UIView的子视图。我只是分配并保留一个自定义标记,以便随时调用UIView,而不是在这里或那里获取强引用

我认为:

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;
是非常可读的,并且避免我编写会使项目膨胀的子类或类扩展

此外,我了解性能的搜索,但现在与过去相比,远程过去的设备功能相当强大,因此,不要担心系统的工作和任务。最好的做法是始终运行探查器XCode有一个好的,测量并解决问题(如果有)