从 Cocoa 中的其他 nib(即 Interface Builder)加载 nib

Posted

技术标签:

【中文标题】从 Cocoa 中的其他 nib(即 Interface Builder)加载 nib【英文标题】:Load nib from other nibs (i.e. Interface Builder) in Cocoa 【发布时间】:2011-12-26 23:31:02 【问题描述】:

我在 Interface Builder 中有一个视图设置,其中包含一个加载另一个 Nib 文件的 viewController。但是,由于某种原因,正在加载的 nib 文件中包含的对象永远不会被称为 awakeFromNib。我在这里想念什么?是否可以在界面构建器中从 Nib 加载视图并在界面构建器中管理它们的属性和大小?

一般来说,管理多个 nib 并将它们组合成复杂视图的最佳做法是什么?

最终解决方案:

我像这样创建了一个 NSViewController 子类。

@interface NibLoadingViewController : NSViewController

// The placeholder would be replaced during run-time by the view
@property (weak, nonatomic) IBOutlet NSView *placeholder;

@end

@implementation NibLoadingViewController 

@synthesize placeholder = _placeholder;

- (void)awakeFromNib 
    if (self.placeholder)
        self.view = self.view; // Trigger lazy loading


- (void)loadView 
    [super loadView];
    if (!self.view)
        return;
    // Replace the placehoder if it exists
    if (self.placeholder) 
        // Copy over relevant attributes
        self.view.frame = self.placeholder.frame;
        self.view.autoresizingMask = self.placeholder.autoresizingMask;
        self.view.autoresizesSubviews = self.placeholder.autoresizesSubviews;
        // Replaces the old view
        [self.placeholder.superview replaceSubview:self.placeholder with:self.view];
        self.placeholder = nil;
    
    self.nextResponder = self.view.nextResponder;
    self.view.nextResponder = self;


@end

这样,您只需在包含视图控制器的 nib 中挂钩占位符插座,它会自动为您加载其他 nib 并从占位符复制所有属性并将其替换到主 nib 中。

【问题讨论】:

【参考方案1】:

nib 文件的内容是延迟加载的。如果你想调用 -(void)awakeFromNib,你需要先从 nib 文件中访问一些东西。

NSViewController *controller = [[NSViewController alloc] initWithNibName:@"MyView" bundle:nil];

/*
 * awakeFromNib was not called yet
 */

NSView *view = controller.view;

/*
 * but now -(void)awakeFromNib was called.
 */

【讨论】:

我明白了,有没有办法只使用界面生成器来显示加载的笔尖? 据我所知没有。我的方法如下所示:我为主窗口创建一个笔尖,为每个复杂视图创建一个笔尖。主窗口的控制器通过调用 -(id)initWithNibName:(NSString*)nibName 加载视图的控制器(例如在 awakeFromNib 中),并使用 window.contentView = 显示视图viewController.view[window.contentView addSubView:viewController.view].

以上是关于从 Cocoa 中的其他 nib(即 Interface Builder)加载 nib的主要内容,如果未能解决你的问题,请参考以下文章

Cocoa 中的共享对象

Cocoa:将子视图添加到来自不同类和 nib 的视图

Cocoa - 从 nib 加载视图并将其显示在 NSView 容器中,作为子视图

Cocoa - 将 IBOutlet 链接到单独的 Nib

nib 本地化时 Cocoa 无法加载窗口 nib 文件

Cocoa (Xcode 4),从另一个 NIB 更改一个 NIB 上的标签