创建一个虚假的所有者是可行的;但是,这样的解决方案可能是脆弱和不可扩展的。从某种意义上说,单元格拥有自己,但即使如此,这也是技术上不正确的。事实上,
UITableViewCell
没有所有者。
实现自定义表视图单元格的正确方法是首先创建一个UITableViewCell的自定义子类。在这个类中,您将为单元格定义所有的IBOutlets等。以下是一个头文件的示例:
@interface RBPersonCell : UITableViewCell
@property (nonatomic, strong) IBOutlet UILabel * nameLabel;
@property (nonatomic, strong) IBOutlet UILabel * ageLabel;
- (void)setupWithPerson:(Person *)person;
@end
接下来,我有一个方便的方法,如果需要的话,可以从nib创建单元格:
+ (id)cellForTableView:(UITableView *)tableView reuseIdentifier:(NSString *)reuseID fromNib:(UINib *)nib {
if (!reuseID)
reuseID = [self cellIdentifier];
id cell = [tableView dequeueReusableCellWithIdentifier:reuseID];
if (!cell) {
NSArray * nibObjects = [nib instantiateWithOwner:nil options:nil];
NSAssert2(([nibObjects count] > 0) &&
[[nibObjects objectAtIndex:0] isKindOfClass:[self class]],
@"Nib '%@' does not appear to contain a valid %@",
[self nibName], NSStringFromClass([self class]));
cell = [nibObjects objectAtIndex:0];
}
return cell;
}
这种方法封装了所有的创建代码,所以我永远不必看到它或重写它。它假设自定义单元格是nib中的第一个根视图。这是一个相当安全的假设,因为你应该只有自定义单元格作为根视图。
有了所有这些代码,你就可以在Interface Builder中工作了。你首先需要在identity inspect中设置自定义类。接下来,不要忘记设置你的单元格标识符。为了方便起见,最好使用自定义类的名称。当你拖动连接时,不要将它们拖到文件所有者,而是将它们拖到自定义单元格本身。
我学习关于自定义表格视图单元格的大部分内容都来自iOS Recipes的15-16个示例。这里是直接从The Pragmatic Bookshelf提取的免费摘录。你可以查看那本书获取更多细节。
编辑:
我终于抽出时间将我的
RBSmartTableViewCell
类开源了。你可以在我的
GitHub上找到它。相比iOS Recipes中的代码,你应该会发现这个类更有用,因为我的类将所有单元格都视为同等处理,无论是使用XIBs、UIStoryboard还是代码构建的。这个仓库还包括可工作的示例。