繁体   English   中英

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

[英]Interface Builder: How to load view from nib file

我有一个在.xib中设计的NSView的MyCustomView子类。

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

EDIT1:

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

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

要加载视图,需要在窗口中添加: - 创建继承到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]];
}

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

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

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

告诉任何视图将您的视图添加为子视图。 添加任何布局约束。 (你可以打造出非常通用的限制通过重写添加自己在您的视图或视图控制器viewDidMoveToSuperviewviewDidMoveToWindow时, superview或窗口不为零。使用同一删除您的约束。)

奇怪的是,你通过告诉它从superview删除一个视图来删除它。

我建议只是以编程方式执行:

  1. 将视图添加到主xib/storyboard并将自定义类设置为自定义视图的类
  2. 在您的自定义视图的xib中,将File的Owner类设置为自定义视图的类
  3. 根据需要连接任何IBOutlets
  4. 创建__strong属性/ ivar以保存对xib的顶级NSView的引用
  5. 在自定义视图的类中实现initFromFrame大致如下:
@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;
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM