Чтение свойства из файла XIB до создания экземпляра - PullRequest
1 голос
/ 03 октября 2011

Пару раз я хотел использовать значение из файла XIB перед созданием экземпляра класса; на ум приходят два:

  • Расчет высоты для ячеек таблицы - все ячейки в таблице основаны на высоте XIB, каждая ячейка может быть расширена, если отображается дополнительная информация, но «базовая» высота должна исходить от XIB.
  • UIFont и размеры - нет смысла дублировать эти значения как константы, но они часто полезны для вычисления высоты ячейки.

В обоих случаях высота ячейки должна быть рассчитана для HeightForCell до создания экземпляров XIB.

Два подхода, которые я рассмотрел:

  • создание экземпляра мусора XIB только для чтения значений.
  • чтение самого файла XIB, чтобы выбрать значения без создания экземпляра.

Несмотря на то, что меня раздражает необходимость дублировать свойства XIB в качестве констант, у меня не было (или не было) времени для реализации любого из этих подходов.

Кто-нибудь еще придумал жизнеспособное решение, или вы просто живете с дублированием констант? Какой из вышеперечисленных подходов вы считаете лучше (как в более безопасном)?

Спасибо.

1 Ответ

0 голосов
/ 04 октября 2011

Я использую подход «мусорного экземпляра», кэшируя и перья, и высоты:

-(NSNib *)nibWithName:(NSString *)nibName {
    // Load the nib, or fetch it if we've already loaded it, then instantiate its contents
    NSNib *nib = [_itemViewNibs objectForKey:nibName];
    if (!nib) {
        nib = [[NSNib alloc] initWithNibNamed:nibName bundle:nil];
        [_itemViewNibs setObject:nib forKey:nibName];
    }
    return nib;
}

- (NSTableCellView *)firstTableCellInstantiatedFromNibWithName:(NSString *)nibName {
    NSArray *nibObjects;

    NSNib *nib = [self nibWithName:nibName];

    if (![nib instantiateNibWithOwner:self topLevelObjects:&nibObjects]) return nil;

    for (id obj in nibObjects)
        if ([obj isKindOfClass:[NSTableCellView class]])
            return (NSTableCellView *)obj;

    return nil;
}

- (CGFloat)tableCellHeightForNibName:(NSString *)nibName {
    NSNumber *height = [_itemViewHeights objectForKey:nibName];

    if (! height) {    
        NSTableCellView *view = [self firstTableCellInstantiatedFromNibWithName:nibName];
        height = [NSNumber numberWithFloat:view.frame.size.height];
        [_itemViewHeights setObject:height forKey:nibName];
    }

    return height.floatValue;
}

...

CGFloat height = [self tableCellHeightForNibName:item.nibName];

...

view = [self firstTableCellInstantiatedFromNibWithName:item.nibName];
...