更改使用loadNibNamed实例化的类

时间:2010-05-04 09:31:43

标签: iphone objective-c nib

我正在尝试使用iPhone SDK更改使用nib创建的对象类。

原因是;我直到运行时才知道该类是什么,我想要nib对象(虽然它们将具有相同的基于UIView的超类),并且我不想为每个可能性创建不同的笔尖 - 因为.nib将是除了一个对象的类之外,每个都相同。

我已经成功了,有几种方法,但要么有一些敲击效果,要么不确定我使用的方法有多安全:

方法1:在超类上覆盖alloc,并将c变量设置为我需要的类:

+ (id) alloc {
 if (theClassIWant) {
  id object = [theClassIWant allocWithZone:NSDefaultMallocZone()]; 
  theClassIWant = nil;
  return object;
 }
 return [BaseClass allocWithZone:NSDefaultMallocZone()];
}

这很好用,我假设“合理”安全,但是如果有一个带有正确类的笔尖作为Nib中的类标识,或者我自己分配一个子类(没有设置'theClassIWant') - 一个对象基类已创建。我也不喜欢重写分配的想法......

方法2:在initWithCoder中使用object_setClass(s​​elf,theClassIWant)(在超类上调用initWithCoder之前):

- (id) initWithCoder:(NSCoder *)aDecoder {
 if (theClassIWant) {

  // the framework doesn't like this:
  //[self release];  
  //self = [theClassIWant alloc];

  // whoa now! 
  object_setClass(self,theClassIWant);

  theClassIWant = nil;
  return [self initWithCoder:aDecoder];
 }

 if (self = [super initWithCoder:aDecoder]) {
           ...
  • 这也很有效,但并非所有子类都必须与超类一样大,所以这可能非常不安全!为了解决这个问题,我尝试在initWithCoder中释放并重新分配到正确的类型,但是我从框架中得到了以下错误:

    “此编码器要求从initWithCoder返回替换的对象:”

不明白这意味着什么!我正在替换initWithCoder中的对象......

对这些方法的有效性或改进或替代方案的建议表示欢迎!

1 个答案:

答案 0 :(得分:0)

虽然我很想知道您是否可以使用您的方法解决此问题,但您可能需要考虑使用custom placeholder objects