【问题标题】:How can I recycle UITableViewCell objects created from a XIB?如何回收从 XIB 创建的 UITableViewCell 对象?
【发布时间】:2012-02-27 08:33:46
【问题描述】:

我想使用 XIB 创建自定义 UITableViewCell,但我不确定如何使用 UITableViewController 的排队机制来回收它。我怎样才能做到这一点?

伙计们,这个问题的目的是按照the FAQ 自行回答,尽管我喜欢这些很棒的回答。点赞,喝杯啤酒犒劳自己。我问这个是因为一个朋友问我,我想把它放在 StackOverflow 上。如果您有任何贡献,请务必!

【问题讨论】:

    标签: ios uitableview uikit xib


    【解决方案1】:

    如果您使用的是 iOS 5,则可以使用

    [self.tableView registerNib:[UINib nibWithNibName:@"nibname" 
                                               bundle:nil] 
         forCellReuseIdentifier:@"cellIdentifier"];
    

    然后无论何时调用:

    cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
    

    tableview 将加载 nib 并为您提供一个单元格,或者为您出列一个单元格!

    笔尖只需是一个内部定义了一个 tableviewcell 的笔尖!

    【讨论】:

    • 这是 iOS5 引入的一个新 API - 从我看到它的那天起就一直在使用它 - 让生活变得如此简单!您甚至可以通过继承 UITableViewCell 并添加指向单元格中各种控件的 IBOutlet 属性来获得更高级的功能,因此您甚至不再需要使用 ViewWithTag!
    • 请注意,启用 VoiceOver 时 iOS 5 中存在一个错误。在这种情况下,-dequeueReusableCellWithIdentifier: 总是返回 nil。请参阅我的解决方法:stackoverflow.com/a/13881778/235297
    • iOS6 中仍然存在这样的错误 - 我在一周前使用 VoiceOver 遇到了它 - 对于已注册的 Nib 和类,dequeue 将返回 nil!
    • IOS 6.1 中修复了这个错误吗?
    • 感谢您的回答,我环顾四周,看到一个涉及加载顶级对象数组的答案,并提到它在文档中。您的回答有助于澄清这是针对 5.0 之前和 iOS 5 之后不再需要的。
    【解决方案2】:

    创建一个空笔尖并将表格单元格添加为第一项。在检查器中,您可以在 Interface Builder 中添加重用标识符字符串。

    要在代码中使用单元格,请执行以下操作:

    - (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
        if (cell == nil)
        {
            cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0];
        }
    
        //set up cell
    
        return cell;
    }
    

    还有另一种方法,您可以为您的单元创建一个插座并使用控制器作为文件所有者加载单元笔尖,但老实说,这要容易得多。

    如果您希望能够访问已添加到 nib 中单元格的子视图,请为它们提供唯一标签并使用 [cell viewWithTag:x] 访问它们;

    如果您希望能够在单元格上设置自定义属性,则需要创建一个自定义 UITableViewCell 子类,然后将其设置为 InterfaceBuilder 中您的 nib 的类,并在您使用时将 UITableViewCell 转换为您的自定义子类在上面的代码中将其出队。

    【讨论】:

      【解决方案3】:

      要使用 XIB 设置自定义 UITableViewCell,您必须做几件事:

      • 在标题中设置 IBOutlet
      • 在 Interface Builder 中配置表格视图单元格
      • tableView:cellForRowAtIndexPath: 中加载XIB
      • 像任何其他单元格一样配置它

      那么...让我们在头文件中设置一个 IBOutlet。

      @property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell;
      

      别忘了在实现文件中合成它。

      @synthesize dvarTorahCell;
      

      现在,让我们创建和配置单元格。您要注意 Cell Identifier 和 IBOutlet,如下所示:

      现在在代码中,您将 XIB 加载到您的单元格中,如下所示:

      请注意,Interface Builder 中的单元格标识符与以下代码中显示的一致。

      然后您继续像其他任何单元一样配置您的单元。

      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
      if (cell == nil) {
      
          [[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil];
          cell = dvarTorahCell;
          dvarTorahCell = nil;
      }
      
      //configure your cell here.
      

      请注意,当访问子视图(例如标签)时,您现在需要通过标签来引用它们,而不是通过属性名称来引用它们,例如 textLabeldetailTextLabel

      【讨论】:

        【解决方案4】:

        你可以怎么做:

        - (UITableViewCell *)tableView:(UITableView *)tableView 
                 cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
          YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName];
          if (!cell)
          {
            NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil];
            cell = [topLevelItems objectAtIndex:0];
          }
        
          return cell;
        }
        

        .h 中的cellLoader 定义如下:

        UINib *cellLoader;
        

        在 .m 中的实例化如下(例如在初始化期间):

        cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain];
        

        CellClassName 在 .m 中定义如下(也是您的 xib 的名称)。

        static NSString *CellClassName = @"YourCustomeCell";
        

        不要忘记在您创建的 xib 单元格中也使用字符串 CellClassName

        有关更多信息,我建议您阅读这篇精彩的教程creating-a-custom-uitableviewcell-in-ios-4

        希望对你有帮助。

        附:我建议你使用UINib,因为它是一种加载xib文件的优化方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-30
          • 2013-04-06
          • 1970-01-01
          • 2016-08-05
          • 1970-01-01
          相关资源
          最近更新 更多