Вы можете использовать пользовательский класс в качестве владельца файла, но это не обязательно. Я покажу вам два метода загрузки ячейки таблицы из 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