为什么使用“viewWithTag”和“dequeueReusableCellWithIdentifier”?

有人可以请解释为什么你应该使用viewWithTagdequeueReusableCellWithIdentifier的单元格获取子视图(如UILabel等)?

一些背景信息:我有一个自定义的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中设置)。

有人可以告诉我哪种方法是首选,为什么?

谢谢!

viewWithTag:只是一个快速和肮脏的方式来拉出子视图,而不必设置IBOutlet属性的父,甚至不必创build一个UITableViewCell子类。

对于非常简单的情况,这是一个可以接受的解决scheme,这就是viewWithTag:意图。 但是,如果您打算重复使用该单元格,或者希望它具有更易于使用开发人员的界面,那么您将需要在第一个示例中inheritance和使用真实属性。

因此,使用viewWithTag:如果它是一个非常简单的单元格,您在IB中devise,没有子类,只有一些标签。 使用具有真实属性的单元格子类来获得更多的实质性内容。

我已经意识到,如果元素以编程方式添加到单元格中(即,未在NIB中定义并通过IBOutlet连接),则使用“viewWithTag”检索元素是有用的 – 这防止为每个实例创build多个标签等的细胞。

对我来说,viewWithTag是一个给予的上帝。 首先:在taskinoor这样的循环中处理所有的视图非常简单。 另外,我个人比较喜欢这种方式,因为如果我看一下代码,想看看视图会发生什么,我只需要search标签。 它被用于处理视图的任何地方。 与xib方法相反,你必须查看代码和xib。 另外,如果你在xib中有一个离屏视图,你可以监督它。 我发现了很多其他程序员所做的xib,这些程序员都是有很多很多的视图。 一些隐藏的,一些在屏幕外的,不能分辨哪个是因为所有重叠。 在这些情况下,我认为xib是不好的。 他们不容易阅读。 我更喜欢代码中所做的一切。

但是,如果您决定使用标签,请记住避免对任何标签进行硬编码。 而是使#define定义列表保持清洁和可读的代码。

正如你所做的那样,我总是通过IBOutlets钩子视图到我的UITableViewCell子类的属性。 我想不出任何使用viewWithTag的好理由。

从UITableViewCell类参考:“TableView:cellForRowAtIndexPath中的表视图的委托:重新使用单元格时应始终重置所有内容”。 保持简单,清除内容视图。 这不会对自定义的单元类,假设,没有阶级检查的假设:

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId]; if (cell != nil) { NSArray* contentSubViews = [cell.contentView subviews]; for (UIView* viewToRemove in contentSubViews) { [viewToRemove removeFromSuperview]; } } 

viewWithTag:允许样式而不创build UITableViewCell 的自定义子类

您可以在Interface Builder中为标签和重用标识符分配原型UITableViewCell ,然后在您的UITableViewController的实现中使用该标签对该视图进行出列和修改,而无需为该单元格创build自定义类或为该单元格的子视图创buildIBOutlets。

在某些情况下,一个单元格的简单性使得一个自定义的类感觉像是矫枉过正。 viewWithTag:允许您将自定义文本和图像添加到Storyboard中的单元格,然后通过代码设置这些自定义,而无需向Xcode项目添加额外的类文件。