【问题标题】:How do you get a custom view controller to load its view into placeholder in another nib?如何让自定义视图控制器将其视图加载到另一个 nib 的占位符中?
【发布时间】:2014-01-07 17:34:53
【问题描述】:

因此,使用 xib/nib 创建一个自定义 NSViewController 子类。 然后在应用程序的主 nib 中,从对象库中添加一个 NSViewController 对象,将类设置为自定义视图控制器类。 在自定义视图控制器的应用委托中创建IBOutlet

NSView 对象添加到窗口。 将视图控制器的视图设置为窗口中的NSView

当我构建和运行时,视图是主笔尖中的通用视图,而不是视图控制器笔尖中的视图...

还需要什么才能让这个过程按照我认为的方式工作? 我认为这应该从自定义视图控制器的笔尖填充视图(和任何子视图)。

我知道如何在代码中做到这一点,但它确实看起来像样板。 (尤其是添加了自动布局约束。)

请告诉我,我遗漏了一些非常明显的东西。

【问题讨论】:

    标签: cocoa xib nsview nib nsviewcontroller


    【解决方案1】:

    当您将NSViewControllerview 出口连接到空的通用容器视图时,它会在运行时用空视图替换从NIB 加载的实际视图。

    不幸的是,纯粹使用 Interface Builder 和 outlets 无法完成您的要求。最简单的替代方法:

    NSViewController 对象添加到主XIB 文件并在属性检查器中设置Nib NameNib Bundle,但不要 em> 将视图出口设置为空容器视图。

    将属性添加到您的应用程序委托(或在 XIB 中公开的其他控制器类)以创建 IBOutlets 到视图控制器和容器视图。示例:

    @property (nonatomic, strong) IBOutlet NSViewController *viewController; // view controller in XIB
    @property (nonatomic, weak) IBOutlet NSView *containerView;
    

    将 XIB 中的这些出口连接到视图控制器和容器视图。现在,在运行时,将视图控制器的视图添加为容器视图的子视图:

    NSView *realView = self.viewController.view;
    realView.frame = self.containerView.bounds;
    // Also configure autoresizing behaviour for realView using either autoresizing masks 
    // or layout constraints so that realView resizes with its parent container
    [self.containerView addSubview:realView];
    

    【讨论】:

    • 这就是我害怕的。但似乎必须有办法。如果基于视图的表视图和 NSCollectionView 可以做到。我想我只是在 xib/nib 中的视图控制器代理中看不到很多用处,如果它只适用于连接绑定和东西的话。我会保留一点额外的回复,但我担心你是正确的。谢谢!
    • 我相信这是对的。 NSViewController 是一个(相对)新的类,它不像 UIViewController 那样酷。在较新的 API(如 NSPopover)中,您可以按照您想象的方式使用它,但我认为,如果只是在窗口中设置视图,您必须编写一些代码。
    • 先生。希普利突然变得活跃起来,仅你的博客就很重要(更不用说你的悠久历史了)......好吧,我会守住堡垒,直到我们得到一些额外的重量:)我真的希望有人知道一些魔法,除非在 10.10 中出现魔法……我知道 UIViewController 和 UIKit 有多少幸运地从头开始做事了不起。
    • 在 Yosmite (10.10) 中这仍然是真的(即无法将视图控制器连接到 IB 中的视图)吗?显然,NSViewController 发生了巨大的变化。
    • 感谢您的回答。这真的帮助了我,你的解释非常清楚和中肯。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 2011-04-26
    • 1970-01-01
    • 2017-09-17
    • 2016-10-01
    • 2012-02-06
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多