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

dbr*_*sco 77 objective-c ios

我有一个UIView被叫,baseView并且我有我在initWithFrame哪里添加一些其他视图和做一些自定义的东西.同一视图也有一个NIB文件.

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

self.view = baseView;但问题是NIB文件没有加载.如何确保定制的东西和NIB文件加载/运行?

Bog*_*tyr 170

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

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

但是,如果您希望View类是在不同视图控制器中多次重复使用的子组件,通过代码或通过包含在另一个控制器的.xib文件中进行集成,那么您需要实现initWithFrame:init方法和awakeFromNib,处理这两种情况.如果您的内部初始化总是包含来自.xib的某些对象,那么在您的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;
Run Code Online (Sandbox Code Playgroud)

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];
}
Run Code Online (Sandbox Code Playgroud)

这是nib文件的样子(除了文件的所有者需要更改为MyView类).

在此输入图像描述

务必将视图和标签插座连接到文件所有者.而已!用于创建可重用UIView小部件的模板.

关于这个结构的真正好处是你可以将MyView对象的实例放在其他nib文件中,只需将UIView放在你想要的位置/大小,然后将身份检查器(CMD-4)中的类更改为MyView,和繁荣,你有你想要的任何视图的小部件实例!就像UIKit对象一样,您可以实现委托协议,以便可以向使用窗口小部件的对象通知有趣的事件,并且可以提供要在窗口小部件中显示的数据以对其进行自定义.

  • awakeFromNib中的loadNibNamed会导致无休止的递归 (5认同)
  • 我喜欢你说我可以实现initWithFrame和awakeFromNib的事实,但我不确定我必须进行什么样的初始化以及按什么顺序进行.你举个例子吗?假设我在IB中添加了一些标签和按钮.我的视图中有一些IBOutlets.现在我想在initWithFrame中对这些对象做一些事情.我如何使用NIB启动视图以便它知道这些对象? (2认同)
  • 确实.当然,在某些情况下,我可以简单地将另一个VC +视图推送到导航控制器,但情况并非总是如此.现在我需要重新阅读有关IBPlugins的信息,请访问:http://cocoawithlove.com/2009/07/custom-views-in-interface-builder-using.html(等,否,不是特定于iOS的,但是还是...) (2认同)