从Nib加载可重用的UITableViewCell

Gre*_*tin 89 iphone cocoa-touch interface-builder uitableview ios

我可以使用http://forums.macrumors.com/showthread.php?t=545061中找到的线程中描述的技术设计自定义UITableViewCells并加载它们.但是,使用该方法不再允许您使用reuseIdentifier初始化单元格,这意味着您必须在每次调用时创建每个单元格的全新实例.有没有人想出一个很好的方法来缓存特定的单元格类型以便重用,但仍然可以在Interface Builder中设计它们?

Tim*_*ing 119

实际上,由于您在Interface Builder中构建单元,只需在那里设置重用标识符:

IB_reuse_identifier

或者,如果您正在运行Xcode 4,请检查"属性"检查器选项卡:

在此输入图像描述

(编辑:XC由XCode生成后,它包含一个空的UIView,但是我们需要一个UITableViewCell;所以你必须手动删除UIView并插入一个Table View Cell.当然,IB不会显示任何UITableViewCell参数UIView的.)

  • 不要将其视为唯一标识符 - 将其视为类型名称. (4认同)
  • 好的,我解决了我的问题.如果您在界面构建器(在Xcode 4中)中使用UIView对象,并将其类更改为UITableViewCell,则不会获得特定于单元格的属性,如重用标识符.要做到这一点,你应该从一个空的xib开始并拖动一个表格单元格对象,然后它将具有你可以编辑的特定于单元格的属性. (3认同)

Lou*_*arg 74

只需使用适当的方法签名实现一个方法:

- (NSString *) reuseIdentifier {
  return @"myIdentifier";
}
Run Code Online (Sandbox Code Playgroud)

  • 这是有风险的.如果您有两个子类的子类,并在单个表视图中使用这两个子类,会发生什么?如果他们将重用标识符调用发送到超级,您将使错误类型的单元格出列..............我认为您需要覆盖reuseIdentifier方法,但让它返回一个取代的标识符串. (5认同)
  • 为了确保它是唯一的,你可以这样做:`返回NSStringFromClass([self class]);` (3认同)
  • 在您的UITableViewCell子类中.http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITableViewCell_Class/Reference/Reference.html#//apple_ref/occ/instp/UITableViewCell/reuseIdentifier (2认同)

小智 66

现在,在iOS 5中有一个适当的UITableView方法:

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
Run Code Online (Sandbox Code Playgroud)

  • 此主题中的其他回复(包括已接受的回答)包含过时的建议. (10认同)

小智 47

我不记得我最初在哪里找到了这段代码,但到目前为止它一直对我有用.

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomTableCellView";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (UITableViewCell *)[nib objectAtIndex:0];
    }

    // perform additional custom work...

    return cell;
}
Run Code Online (Sandbox Code Playgroud)

Interface Builder设置示例...

alt text http://i32.tinypic.com/a9mnap.jpg


Ken*_*ner 12

看看我给这个问题的答案:

是否可以在Interface Builder中设计NSCell子类?

不仅可以在IB中设计UITableViewCell,这是可取的,因为否则所有手动布线和多个元素的放置都非常繁琐.只要您在可能的情况下小心使所有元素都不透明,性能就可以了.对于UITableViewCell的属性,在IB中设置了reuseID,然后在尝试出列时在代码中使用匹配的重用ID.

去年WWDC的一些主持人也听说你不应该在IB中制作桌面视图单元格,但这是一堆铺位.

  • 如果您需要透明度并且需要良好的滚动性能,则不应在IB中创建表格视图单元格.对于某些UI,您需要透明度(例如,在图形上呈现文本).有时,在旧的(A4之前的)硬件上实现良好滚动的唯一方法是在代码中渲染,以避免GPU必须合成多个透明层. (2认同)
  • 没错,但即便如此,你可能会更好地让旧设备上的性能受到轻微影响,以便更容易维护IB内置的单元.您还可以将此技术用作模板单元格,然后从中绘制元素以避免使用自定义绘制方法进行合成. (2认同)

Ben*_*her 7

从iOS大约4.0开始,iOS文档中有一些特定的说明可以让这项工作超级快速:

http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

向下滚动到它谈论子类化UITableViewCell的地方.


JDL*_*JDL 6

这是另一种选择:

NSString * cellId = @"reuseCell";  
//...
NSArray * nibObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableCell" owner:nil options:nil];

for (id obj in nibObjects)
{
    if ([obj isKindOfClass:[CustomTableCell class]])
    {
        cell = obj;
        [cell setValue:cellId forKey:@"reuseIdentifier"];
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)