Objective C - 从笔尖加载 UIView?
Posted
技术标签:
【中文标题】Objective C - 从笔尖加载 UIView?【英文标题】:Objective C - Loading a UIView from nib? 【发布时间】: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];
【问题讨论】:
【参考方案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 只是将这些对象复制到内存中。对象一经创建就无法更改其类型。以上是关于Objective C - 从笔尖加载 UIView?的主要内容,如果未能解决你的问题,请参考以下文章