从XIB文件实例化一个UIView作为文件的所有者?
比方说,我有一个XIB文件(MyView.xib)包含一个单一的根UIView其类是一些自定义的UIView子类(MyView)。
我想从XIB文件创buildMyView的实例(在代码中),但我也希望文件的所有者是MyView的实例(这样我可以将IBOutlets从XIB链接到代码)。
换句话说,MyView是XIB中的根视图的类,它也被设置为文件的所有者类。
我在MyView实现中尝试了这样的事情:
- (id)initFromNib { self = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject]; return self; }
然后我意识到这是没有道理的,因为那时候self
是零,所以文件的所有者被设置为零(不好)。
这开始感觉像鸡蛋问题,因为我需要文件的所有者是在创build之前即将创build的实例。
然后我尝试了这样的事情:
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:CGRectMake(0.0, 0.0, 310, 166)]; if (self) { self = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] firstObject]; } return self; }
显然这只是一个临时的黑客,看看它是否会起作用,但是不行。 该视图被加载并正确显示,但是当我按下其中一个button(具有相关联的IBAction)时,该应用程序崩溃。
我错过了什么明显的? 或者是我的理解有某种缺陷?
一般的问题是,我只想拥有一个包含该视图的可视化表示的关联XIB的自定义UIView子类,并且还希望能够在XIB和其对应的UIView子类之间关联IBOutlets。
任何和所有的build议是受欢迎的。
经过一些挖掘,我发现了一个解决方法。 基本上,而不是将我的IBOutlets和IBActions链接到文件的所有者,我将它们直接链接到根视图的类(它具有通过自定义子类暴露的IB属性)。
关键是不依赖文件的所有者,而是直接将出口和动作连接到自定义视图。
这是我最终要做的初始化工具:
- (instancetype)initFromNib { return [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil] firstObject]; }
这似乎现在工作正常。
UPDATE
我已经在UIView上创build了一个用于从XIB初始化视图(它假定XIB名称与类名相同)的类别。
UIView的+ Initialization.h
#import <UIKit/UIKit.h> @interface UIView (Initialization) - (instancetype)initFromNib; @end
UIView的+ Initialization.m
#import "UIView+Initialization.h" @implementation UIView (Initialization) - (instancetype)initFromNib { return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:nil options:nil] firstObject]; } @end
你可以简单地做:
MyView *myView = [[MyView alloc] initFromNib];
假设你有一个MyView.xib
文件和一个根视图,其类是MyView。
- 如何debuggingdsymutil错误:“Clang模块预计只有一个编译单元。”
- 在iOS应用程序中构build信息(build立date/时间应用程序)
- 为什么我的视图不能在Storyboard中显示,并在左侧窗格中显示为灰色?
- 从SKscene(SpriteKit)演示UIViewController
- 不兼容的指针types,用'BaseClass *'types的expression式初始化'SubClass * __ strong'
- UIViewController中的socketsnil在viewdidload中
- 有没有一个选项可以隐式地在Interfacebuilder中定位标签
- 在Facebook用户的Xcode中查看ProfilePicture
- 实现以编程方式生成的视图的自动布局