如何将initWithNib添加到派生的子类中

时间:2013-12-12 02:03:08

标签: ios uiview uitableview nib

我有以下类层次结构:

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

如何初始化FruitCell.xib但确保它是kindOfClass PeachCell.m或BananaCell.m而没有2个FruitCell.xib副本?现在,FruitCell.xib中的.view属于FruitCell类。

除了尝试将我的FruitCell实例中的每个IBOutlet分配给我的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 个答案:

答案 0 :(得分:1)

我建议使用以下选项之一:

1)拥有两个FruitCell.xib副本(这真的不是那么糟糕)

2)代替FruitCell.xib,在代码中创建PeachCell和BananaCell实例,并加载一个FruitCellContents.xib,它只包含一个子视图,可以添加到已经创建的单元格的contentView中。

3)这更复杂或许不值得麻烦,但你可以通过保持当前的FruitCell.xib并覆盖FruitCell类中的initWithCoder:以返回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;
}

catch决定在哪个类初始化。我没有比在加载笔尖之前设置的全局或线程局部更好的想法,并且之后清除。因此,您先调用[FruitCell prepareToLoadWithClass:[PeachCell class]],然后加载笔尖。