当前位置:  开发笔记 > IOS > 正文

从Nib加载可重用的UITableViewCell

如何解决《从Nib加载可重用的UITableViewCell》经验,为你挑选了7个好方法。

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



1> Tim Keating..:

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

IB_reuse_identifier

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

在此输入图像描述

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


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

2> Louis Gerbar..:

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

- (NSString *) reuseIdentifier {
  return @"myIdentifier";
}


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

3> 小智..:

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

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier


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

4> 小智..:

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

- (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;
}

Interface Builder设置示例...

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



5> Kendall Helm..:

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

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

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

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


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

6> Ben Mosher..:

从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的地方.



7> JDL..:

这是另一种选择:

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;
    }
}

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有