Interface Builder:如何从nib文件加载视图

时间:2013-10-31 07:08:53

标签: objective-c cocoa nsview

我在.xib中设计了一个来自 NSView 的MyCustomView子类。

我想将此视图插入到我的其他一些xib的应用程序中。我该怎么做?如果我拖动自定义视图并将类更改为MyCustomView,但不加载我的xib文件。这只能以编程方式完成,还是有办法在界面构建器中执行此操作?

EDIT1:

这是一个非常小的演示项目: http://s000.tinyupload.com/index.php?file_id=09538344018446482999

它包含默认的MainMenu xib和我的CustomView xib。我希望我的 CustomView.xib 显示在添加到我的 MainMenu.xib 的自定义视图中 - 使用尽可能少的代码。

4 个答案:

答案 0 :(得分:6)

要加载视图,您需要在窗口中添加: - 创建继承到NSViewController的自定义视图类

#import <Cocoa/Cocoa.h>

@interface NewViewController : NSViewController

@end

#import "NewViewController.h"

@implementation NewViewController

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
    }

    return self;
}

@end

您的xib名称为yourview.xib

- (void)windowDidLoad {
    NSViewController *yourVC = [[NewViewController alloc] initWithNibName:@"NewViewController" bundle:nil];
    [[[self window] contentView] addSubview:[yourVC view]];
}

答案 1 :(得分:0)

听起来你需要一个容器视图。但我认为你必须使用故事板才能在界面构建器中使用它。

答案 2 :(得分:0)

使用视图控制器,因为它将为您处理笔尖加载,并提供以可重用方式连接IBOutletIBActions的位置。

在您的app appate或任何控制器中创建视图控制器的实例。 让您的视图控制器加载其视图。 将返回类型强制转换为视图类名称。 然后保持对视图控制器和视图的引用。

告诉任何视图将您的视图添加为子视图。 添加任何布局约束。 (当viewDidMoveToSuperview或窗口不是nil时,您可以通过覆盖viewDidMoveToWindowsuperview来构建非常通用的约束以在视图或视图控制器中添加自己。使用相同的约束来删除约束。 )

奇怪的是,您通过告知视图将其自身从superview移除来移除视图。

答案 3 :(得分:-1)

我建议以编程方式执行此操作:

  1. 将视图添加到主xib/storyboard并将自定义类设置为自定义视图的类
  2. 在您的自定义视图的xib中,将File的Owner类设置为自定义视图的类
  3. 根据需要连接任何IBOutlets
  4. 制作一个__strong属性/ ivar,用于保存对xib顶级NSView的引用
  5. 在自定义视图的类中大致如下实现initFromFrame
  6. @interface CustomView ()
    {
        __strong NSView *nibView;
    }
    @end
    
    @implementation CustomView
    
    - (id)initWithFrame:(NSRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            NSArray *nibObjects;
            [[NSBundle mainBundle] loadNibNamed:@"CustomView" owner:self topLevelObjects:&nibObjects];
            nibView = nibObjects[1];
            [self addSubview:nibView];
        }
        return self;
    }
    

    IBOutlet调用后,loadNibNamed会立即连接,因此您可以从那里进行进一步的初始化。

    另一种选择是纯粹以编程方式执行操作: 1.在自定义xib中,将根View的类设置为自定义类 2.在自定义类中实现awakeFromNib以执行初始化 3.在您的自定义loadNibNamed:上调用xib,并以编程方式将其添加到用户界面,而不使用界面构建器。