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?的主要内容,如果未能解决你的问题,请参考以下文章

从笔尖创建 UITableViewCell,动态单元格高度

视图从笔尖加载但不可见?

从笔尖加载的 UIView 未显示多个 UILabel

iOS:从笔尖加载自定义 UIView

从笔尖加载的 UITableViewCell 未更新(缓存?)

任何想法如何从同一工作区下的其他项目加载笔尖 - IOS?