我正在试图弄清楚如何将自定义UITableViewCell实现为nib ...我知道UITableView是如何工作的,但是使用Interface Builder NIB实现自定义单元会增加复杂性......但是有助于提高灵活性......我的问题是这样的:
在Interface Builder中设计自定义单元格之后,我们是否需要创建一个Obj-C自定义类来分配为文件所有者,就像我们在ViewControlers中一样?
答案 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