Custom UITableViewCell nib是否需要自定义OBJ-C类作为文件所有者?

时间:2009-08-11 16:59:05

标签: uitableview interface-builder

我正在试图弄清楚如何将自定义UITableViewCell实现为nib ...我知道UITableView是如何工作的,但是使用Interface Builder NIB实现自定义单元会增加复杂性......但是有助于提高灵活性......我的问题是这样的:

在Interface Builder中设计自定义单元格之后,我们是否需要创建一个Obj-C自定义类来分配为文件所有者,就像我们在ViewControlers中一样?

1 个答案:

答案 0 :(得分:1)

您可以使用自定义类作为文件的所有者,但您不必这样做。我将向您展示两种从NIB加载表格单元格的技术,一种使用文件所有者,另一种不使用。

不使用文件的所有者,这是从NIB加载表格单元格的一种方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *myCell = [tableView dequeueReusableCellWithIdentifier:@"MyID"];
    if (!myCell) {
        NSBundle *bundle = [NSBundle mainBundle];
        NSArray *topLevelObjects = [bundle loadNibNamed:@"MyNib" owner:nil options:nil];
        myCell = [topLevelObjects lastObject];
    }
    /* setup my cell */
    return myCell;
}

上面的代码很脆弱,因为将来如果你修改XIB以获得更多的顶级对象,这个代码可能会因为从“[topLevelObjects lastObject]”获取错误的对象而失败。尽管如此,它并不脆弱,所以这种技术很好用。

为了更加明确和健壮,您可以使用文件的所有者和插座,而不是使用顶级对象。这是一个例子:

@interface MyTableViewDataSource : NSObject {
    UITableViewCell *loadedCell;
}
@property (retain) UITableViewCell *loadedCell;
@end

@implementation MyTableViewDataSource

@synthesize loadedCell;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *myCell = [tableView dequeueReusableCellWithIdentifier:@"MyID"];
    if (!myCell) {
        [[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:nil];
        myCell = [[[self loadedCell] retain] autorelease];
        [self setLoadedCell:nil];
    }
    /* setup my cell */
    return myCell;
}
@end