Лично я думаю, что оба предложенных учебника имеют большой недостаток, когда дело доходит до reuseIdentifier
. Если вы забудете назначить его в построителе интерфейса или опечатать его, вы будете загружать нить каждый раз, когда вызывается cellForRowAtIndexPath
.
Jeff LaMarche пишет об этом и как исправить это в этом blog post. Помимо reuseIdentifier
он использует тот же подход, что и в документации на яблоко, на Loading Custom Table-View Cells From Nib Files.
После того, как прочитал все эти статьи, я придумал следующий код:
Edit: Если вы ориентируетесь IOS 5.0 и выше, вы хотите придерживаться Duane Fields' answer
@interface CustomCellWithXib : UITableViewCell
+ (NSString *)reuseIdentifier;
- (id)initWithOwner:(id)owner;
@end
@implementation CustomCellWithXib
+ (UINib*)nib
{
// singleton implementation to get a UINib object
static dispatch_once_t pred = 0;
__strong static UINib* _sharedNibObject = nil;
dispatch_once(&pred, ^{
_sharedNibObject = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
});
return _sharedNibObject;
}
- (NSString *)reuseIdentifier
{
return [[self class] reuseIdentifier];
}
+ (NSString *)reuseIdentifier
{
// return any identifier you like, in this case the class name
return NSStringFromClass([self class]);
}
- (id)initWithOwner:(id)owner
{
return [[[[self class] nib] instantiateWithOwner:owner options:nil] objectAtIndex:0];
}
@end
UINib (доступный в iOS 4.0 и более поздних версиях) используется здесь как одноэлементный, поскольку, хотя используется reuseIdentifier
, ячейка по-прежнему повторно инициализируется примерно 10 раз или около того. Теперь cellForRowAtIndexPath
выглядит следующим образом:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
CustomCellWithXib *cell = [tableView dequeueReusableCellWithIdentifier:[CustomCellWithXib reuseIdentifier]];
if (cell == nil) {
cell = [[CustomCellWithXib alloc] initWithOwner:self];
}
// do additional cell configuration
return cell;
}
На мой взгляд, это лучший способ. Спасибо вам за это. Если бы это была моя тема, я бы назвал ее ответом. –