Требуется ли пользовательское перо UITableViewCell пользовательский класс OBJ-C в качестве владельца файла?

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

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


person JFMartin    schedule 11.08.2009    source источник


Ответы (1)


Вы можете использовать собственный класс в качестве владельца файла, но это не обязательно. Я покажу вам два метода загрузки ячейки таблицы из 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
person Jon Hess    schedule 17.08.2009
comment
Я использую первый метод, поскольку он, кажется, используется многими разработчиками ... Но я предпочитаю второй, потому что он в конечном итоге дает мне больше контроля над тем, что мы можем делать в пользовательском классе, чтобы добавить больше кода инициализации ... .. более объектно-ориентированный ... - person JFMartin; 18.08.2009