这是我发明用于加载自定义单元格的方式
1)我使用我的UITableViewCell类扩展
//.h
@interface UITableViewCell (Extended)
+ (id) cellWithClass:(Class)class;
+ (id) cellWithClass:(Class)class fromNibNamed:(NSString *)nibName;
@end
//.m
+ (id) cellWithClass:(Class)class
{
return [UITableViewCell cellWithClass:class fromNibNamed:NSStringFromClass(class)];
}
+ (id) cellWithClass:(Class)class fromNibNamed:(NSString *)nibName {
NSArray * nibContents = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:NULL];
NSEnumerator * nibEnumerator = [nibContents objectEnumerator];
NSObject * nibItem = nil;
while ((nibItem = [nibEnumerator nextObject]) != nil) {
if ([nibItem isKindOfClass:class]) {
return nibItem;
}
}
return nil;
}
2)使用同名的.nib(CustomCell.xib)创建自定义UITableViewCell子类,其中我连接了所有出口
@interface CustomCell : UITableViewCell
@property (weak, nonatomic) IBOutlet UILabel * labelSmth;
- (void) setupWithTitle:(NSString *)title;
@end
2)在使用“界面”构建器的CustomCell.xib中,我拖动一个UITableViewCell并使其成为CustomCell类(具有重用标识符CustomCell)(我不设置文件所有者)...而不是UI样式,连接出口等...
3)而不是像这样加载
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString * identifier = @"CustomCell";
CustomCell * cell = [self.tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [UITableViewCell cellWithClass:[CustomCell class]];
}
[CustomCell setupWithTitle:[self.titles objectAtIndex:[indexPath row]]];
return cell;
}
* 这个方法好吗?这适用于许多项目,但我不确定重复使用者以及如果细胞得到适当重用的事实...... *
我也不确定这个
NSArray * nibContents = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:NULL];
因为我在班级方法中传递了所有者...
Apple也提出了- (void) registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)reuse;
这怎么能适合我的做法?
以及如何使用自定义重用标识符,就像我想要一个方法
+ (id) cellWithClass:(Class)class fromNibNamed:(NSString *)nibName reuseIdentifier:(NSString *)reuseIdentifier;
答案 0 :(得分:3)
你不需要为此发明新的东西。它已经为你发明了。你发明的是用于加载自定义单元格的常见反模式。
枚举nib内容以获取nib中的UITableViewCell并不是正确的方法。
您应该在创建UITableViewCell(通常是UIViewController)的nib的文件所有者中定义和插入UITableViewCell。
然后您可以使用以下模式访问该单元格:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"MyCustomCell"; //this should also be specified in the properties of the UITableViewCell in the nib file
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(!cell) {
[[NSBundle mainBundle] loadNibNamed:cellIdentifier owner:self options:nil];
cell = self.myCustomCellOutlet;
self.myCustomCellOutlet = nil;
}
return cell;
}