Требуется ли для кончика Custom UITableViewCell пользовательский класс OBJ-C в качестве владельца файла? - PullRequest
0 голосов
/ 11 августа 2009

Я пытаюсь выяснить, как реализовать пользовательский UITableViewCell в качестве пера ... Я знаю, как работает UITableView, но реализация пользовательской ячейки с помощью Interface Builder NIB добавляет сложности ... но помогает гибкости .... Так что мой вопрос это:

После проектирования пользовательской ячейки в Интерфейсном Разработчике, нам нужно создать пользовательский класс Obj-C, который будет назначен в качестве владельца файла, как мы должны делать в ViewControlers?

1 Ответ

1 голос
/ 17 августа 2009

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