【问题标题】:Objective C - Loading a UIView from nib?Objective C - 从笔尖加载 UIView?
【发布时间】:2011-08-01 22:43:47
【问题描述】:

我有一个从nib 文件初始化自身的基类。 我怎样才能继承这个class。 每次我初始化它的 subclass 时,它都会创建一个基类的对象,而不是我正在尝试创建的实际 class

基类

@implementation BaseClass
- (id)init{
   self = [[[[NSBundle mainBundle] loadNibNamed:@"BaseClass" 
                                          owner:self 
                                        options:nil] lastObject] retain];
   if (self){
   }

   return self;
}

@end

A类

@implementation MyClass //Inheriting from BaseClass
- (void)init {
   self = [super init];

   if (self) {
   }

   return self;
}

- (void)methodSpecificToThisClass {
   //do something
}
@end

用法

// It crashes when I call 'methodSpecificToThisClass' 
// because the type that has been created is a type 
// of my BaseClass instead of MyClass
MyClass *myClass = [[MyClass alloc] init];
[myClass methodSpecificToThisClass];

【问题讨论】:

    标签: objective-c subclass nsbundle loadnibnamed


    【解决方案1】:

    self = [[[[NSBundle mainBundle] loadNibNamed:@"BaseClass" owner:self options:nil] lastObject] retain]; 更改为self = [[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil] lastObject] retain];

    这当然是假设您对每种视图类型都有单独的笔尖。

    【讨论】:

    • 我为所有继承类使用 1 个 nib 文件,它被称为“BaseClass”,因此调用您提到的内容将返回 nil,因为它找不到具有该名称的 nib 文件
    • 如果你在 nib 中只有一个基类,你怎么期望从中提取其他东西?
    【解决方案2】:

    因为您总是从同一个 nib 文件加载对象,所以您总是得到相同的对象。如果 nib 中的对象是 BaseClass 类型的,那么当您加载 nib 时,您将获得 BaseClass 类型的对象。分配MyClass 并不重要——分配的东西不会发挥作用,因为您将self 分配给加载的对象。 (事实上​​,由于您在重新分配self 之前从未释放分配的内存,因此您正在泄漏分配的内存。)您将指针声明为MyClass* 也无关紧要——这使您可以调用-methodSpecificToThisClass 而不会收到编译器的投诉,但它不会改变实际对象是BaseClass 的实例这一事实。当您调用该方法时,当运行时尝试解析选择器并发现该对象不存在该选择器时,您会收到“未实现的选择器”错误。

    如果您想从笔尖加载MyClass,您将不得不使用包含MyClass 而不是BaseClass 的笔尖。

    【讨论】:

    • 似乎在Objective C中你不能继承从笔尖创建的UIElements。所以我最终在代码中填充了我的 UI 元素,而不是从笔尖填充。
    • @aryaxt:对。可以这样想:nib 文件包含已经创建的对象,加载 nib 只是将这些对象复制到内存中。对象一经创建就无法更改其类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多