我有以下类层次结构:
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;
}
}
谢谢!
答案 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]]
,然后加载笔尖。