UIView 和 initWithFrame 以及一个 NIB 文件。如何加载 NIB 文件?

我有一个 UIView称为 baseView,在那里我有 initWithFrame,我添加了一些其他的意见,并做一些自定义的东西。同一视图还有一个 NIB 文件。

现在我有一个名为 AppControllerUIViewController类,在这个类中,我想将 baseView视图添加到 AppController视图的视图中,所以我这样做:

但问题是 NIB 文件没有加载。如何确保加载/运行定制的内容和 NIB 文件?

78235 次浏览

如果您想使用 NIB,最好将您的 UIView 链接到 UIViewController,在这种情况下,您可以使用

UIViewController *vc=[[UIViewController alloc] initWithNibName:@"YourNIBWihtOUTEXTENSION" bundle:nil]


[self.view addSubView:vc.view ];

为了防止内存泄漏,你必须释放 vc

您有许多选项,这取决于您的“ baseView”类将如何被使用并集成到您的应用程序中。目前还不清楚您打算如何使用这个类——作为 UIViewController 子类中的视图,或者作为可重用的模块化组件,意味着在整个应用程序中多次实例化,以便在许多不同的视图控制器中使用。

如果您的视图是 UIViewController 子类中的唯一视图,那么 Phonitive 是正确的——将它与 UIViewController 子类绑定在一起。Xib 文件,并使用 UIViewController 的 viewDidLoad 进行最终初始化。

但是,如果希望在不同的视图控制器中多次重用 View 类的子组件,则可以通过代码或通过包含在。然后,您需要同时实现 initWithFrame: init 方法和 awakeFromNib 来处理这两种情况。如果您的内部初始化始终包含。然后在 initWithFrame 中加载。为了支持希望通过代码创建小部件的“客户”类,可以手动使用 xib。同样,如果。Xib 文件包含您的对象,然后您需要确保从 awakeFromNib 调用任何代码所需的终结。

下面是一个示例,演示如何使用一个 nib 中的 UI 设计创建 UIView 子类组件。

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 类)。

enter image description here

确保将视图和标签插座都连接到文件的所有者。就是这样!用于创建可重用的 UIView 小部件的模板。

这种结构真正简洁的地方在于,你可以把你的 MyView 对象的实例放在其他的 nib 文件中,只需把一个 UIView 放在你想要的位置/大小,然后把身份检查器(CMD-4)中的类更改为 MyView,然后,你就可以在任何你想要的视图中得到一个小部件的实例了!就像 UIKit 对象一样,您可以实现委托协议,这样使用您的小部件的对象就可以得到感兴趣事件的通知,并且可以提供数据在小部件中显示以便对其进行定制。

我发现这篇文章后,有一个问题,试图在我的应用程序这样做。我试图在 ViewDidLoad 方法中从一个 NIB 实例化视图,但是控件的行为就好像它们被禁用了一样。我努力尝试直接设置 userInteractionEnable 属性,并通过编程方式设置该视图中按钮的触摸事件选择器。什么都没用。我偶然发现了另一篇文章,发现 viewDidLoad 可能太快了,无法加载这个 NIB。我将负载转移到 ViewWillAppear 方法,一切正常。希望这能帮到其他人。主要的反应是伟大的,工作良好,现在我有它被称为从适当的地方。

如果您有一个带 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];
}

这篇文章帮助了我。这个技巧与将 IBOutlet 设置为 FileOwner 有关,然后在加载笔尖之后将内容视图添加到自身