UIView和initWithFrame和一个NIB文件。 我怎样才能得到加载的NIB文件?
我有一个名为baseView
的UIView
,在那里我有initWithFrame
,我添加一些其他的意见,并做一些自定义的东西。 同样的观点也有一个NIB文件。
现在我有一个名为AppController
的UIViewController
类,我想将baseView
视图添加到AppController
视图的视图,所以我这样做:
self.view = baseView;
但问题是NIB文件没有被加载。 我如何确保定制的东西和NIB文件得到加载/运行?
你有很多select,取决于你的“baseView”类是如何使用和集成到你的应用程序。 目前还不清楚你打算如何使用这个类 – 作为UIViewController子类中的视图,或者作为一个可重用的模块化组件,意味着在整个应用程序中被多次实例化,用于许多不同的视图控制器。
如果您的视图是UIViewController子类中的唯一视图,那么Phonitive是正确的 – 将它与UIViewController子类.xib文件捆绑在一起,并使用UIViewController的viewDidLoad进行最终初始化。
但是如果你希望你的View类在不同的视图控制器中重复使用多次,可以通过代码或者通过包含在另一个控制器的.xib文件中来集成,那么你需要实现initWithFrame:init方法和awakeFromNib,来处理这两种情况。 如果你的内部初始化总是包含来自.xib的一些对象,那么在你的initWithFrame中,你需要手动加载你的.xib来支持想要通过代码创build你的Widget的“客户”类。 同样,如果一个.xib文件包含你的对象,那么你需要确保你从awakeFromNib中调用任何代码所需的结束。
下面是一个如何在UI中使用UIdevise创buildUIView子类组件的例子。
MyView.h:
@interface MyView : UIView { UIView *view; UILabel *l; } @property (nonatomic, retain) IBOutlet UIView *view; @property (nonatomic, retain) IBOutlet UILabel *l;
MyView.m:
#import "MyView.h" @implementation MyView @synthesize l, view; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code. // [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; [self addSubview:self.view]; } return self; } - (void) awakeFromNib { [super awakeFromNib]; // commenters report the next line causes infinite recursion, so removing it // [[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil]; [self addSubview:self.view]; } - (void) dealloc { [l release]; [view release]; [super dealloc]; }
以下是nib文件的外观(除了该文件的所有者需要更改为MyView类)。
请务必将视图和标签出口连接到文件所有者。 而已! 用于创build可重用的UIView小部件的模板。
关于这个结构真的很干净,你可以把你的MyView对象的实例放在其他的nib文件中,只需要放置一个UIView到你想要的位置/大小,然后把这个类在身份检查器(CMD-4)中更改为MyView,和繁荣,你有任何意见你的小部件的实例! 就像UIKit对象一样,您可以实现委托协议,以便使用您的窗口小部件的对象可以被通知有趣的事件,并且可以提供数据显示在窗口小部件中进行自定义。
我发现这个post后有一个问题,试图在我的应用程序中做到这一点。 我试图在ViewDidLoad方法中从NIB实例化视图,但是控件的行为就像被禁用了一样。 我努力尝试直接设置userInteractionEnabled属性,并以编程方式为此视图中的button设置触摸事件select器。 没有工作。 我偶然发现另一个post,发现viewDidLoad可能太快,无法加载此NIB。 我将负载移到ViewWillAppear方法,一切正常。 希望这可以帮助别人解决这个问题。 主要的反应是伟大的,现在我已经从适当的地方被召唤了。
如果你想使用一个NIB,最好把你的UIView与一个UIViewController链接起来,在这种情况下你可以使用
UIViewController *vc=[[UIViewController alloc] initWithNibName:@"YourNIBWihtOUTEXTENSION" bundle:nil] [self.view addSubView:vc.view ];
由于内存泄漏,你必须释放vc
如果你有一个xib文件的自定义UIView。
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; id mainView; if (self) { NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"HomeAllAdsView" owner:self options:nil]; mainView = [subviewArray objectAtIndex:0]; } return mainView; } - (void) awakeFromNib { [super awakeFromNib]; }
这篇文章帮助我使用Interface Builder和Auto Layout构build可重用视图 。 诀窍是将IBOutlets设置为FileOwner,然后在加载笔尖之后将内容视图添加到自己