2013-12-12 3 views
1

я получил следующую иерархию классов:Как initWithNib к производному подкласса

FruitCell : UITableViewCell (with associated .xib) 
    ---------------------------- 
    |       | 
BananaCell : FruitCell  PeachCell : FruitCell 

Как инициализировать FruitCell.xib, но убедитесь, что он kindOfClass PeachCell.m или BananaCell.m без 2-х экземплярах FruitCell.xib? Прямо сейчас .view в FruitCell.xib относится к классу FruitCell.

Я не уверен, что делать, если не пытаться назначить каждый IBOutlet из моего экземпляра FruitCell на мой BananaCell или PeachCell, но тогда IBAction не обрабатываются.

======== EDIT Просто добавить, это то, как я загружаю перо и найти правильный класс

NSArray *topLevelObjects = [bundle loadNibNamed: nibNameOrNil owner: self options:nil]; 
for (id object in topLevelObjects) { 
    if ([object isKindOfClass: [FruitCell class]]) { 
     // need to somehow change before loadNibNamed this to Banana or Peach 
     return object; 
    } 
} 

Спасибо!

ответ

1

Я хотел бы предложить один из следующих вариантов:

1) Есть две копии FruitCell.xib (это на самом деле не так уж плохо)

2) Вместо FruitCell.xib, создать свой PeachCell и Экземпляры BananaCell в коде и загрузить FruitCellContents.xib, который просто содержит подзаголовок, который вы можете добавить в контент-контент уже созданной ячейки.

3) Это сложнее, возможно, не стоит проблем, но вы можете получить то, что хотите, сохранив свой текущий FruitCell.xib и переопределив initWithCoder: в своем классе FruitCell, чтобы вместо этого вернуть экземпляр либо BananaCell, либо PeachCell. Что-то вроде:

static Class substituteClass; 
+ (void)prepareToLoadWithClass:(Class)c { 
    substituteClass = c; 
} 

- (instancetype)initWithCoder:(NSCoder *)aCoder { 
    if (substituteClass) { 
     substituteClass = Nil; // because the next line will call this method again as its superclass 
     self = [[substituteClass alloc] initWithCoder:aCoder]; 
    } else { 
     self = [super initWithCoder:aCoder]; 
    } 
    return self; 
} 

Уловка решает, какой класс инициализировать там. У меня на самом деле нет идеи лучше, чем глобальная или нить-локальная, которую вы устанавливали перед загрузкой и затем очищаете. Итак, сначала позвоните по телефону [FruitCell prepareToLoadWithClass:[PeachCell class]], затем загрузите наконечник.

+0

Да, корень проблемы в том, что у меня есть метод (IBAction) в моем классе FruitCell, который я хочу переопределить. Я знаю о нескольких беспорядочных вещах, которые я могу сделать, но было бы неплохо просто наложить наконечник на производный подкласс :( –

+0

OK. У меня есть еще одно предложение. –

+0

@MikeS Посмотрите сейчас. –

Смежные вопросы