NSViewController 和界面生成器

Posted

技术标签:

【中文标题】NSViewController 和界面生成器【英文标题】:NSViewController & Interface Builder 【发布时间】:2011-12-24 12:03:06 【问题描述】:

我有一个简单的项目,它由一个简单的窗口组成,其中一个视图来自 NSViewController(请参阅http://i.stack.imgur.com/UAn6L.png)

视图被管理(+ 链接,见截图)到我的自定义视图控制器对象。

我将一个 ViewController 对象拖到我的 MainMenu.xib 中,连接视图出口并设置 Controller-Class + Nib-Name。

当我启动应用程序时,我的自定义视图不会显示在窗口中(“awakeFromNib”在我的自定义 NSViewController 子类中被调用!)。

查看截图了解 IB 详情 -> http://i.stack.imgur.com/UAn6L.png

任何想法我错过了什么?

【问题讨论】:

【参考方案1】:

我假设您有一个名为CustomImageView 的单独 Nib,但未显示(由 Xcode 自动创建的那个)。在这种情况下,您可以将控件和绘图代码添加到该单独 Nib 中的视图中。要将视图控制器的视图实际添加到窗口中,您必须通过从 AppDelegate 到视图控制器的 IBOutlet 连接以编程方式完成,并在您想要添加视图时添加以下代码:(通常在 @987654322 @)

[viewController.view setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
[viewController.view setFrame:NSInsetRect([window.contentView bounds], 20, 20)];
[window.contentView addSubview:viewController.view];

这将使它像您在屏幕截图中一样插入并居中。问题在于,通过在 MainMenu Nib 中创建 view 连接,您将覆盖单独的 CustomImageView Nib 中的连接。您可以删除窗口中的自定义视图对象...您必须以编程方式添加自定义视图。如果它以这种方式工作会很好,但事实并非如此。

编辑:

这是因为笔尖未归档的顺序。首先实例化 CustomImageView 并建立其所有连接。此时view 属性已正确设置。然后 MainMenu 再次连接 view 属性,覆盖单独 Nib 中的 view 属性。现在视图属性设置不正确。这是正常的行为。如果您使用单独的 nib,则必须保持未连接并在代码中添加视图控制器的视图。

另一种方法是不使用单独的笔尖。只需将其从您的项目中删除,设置您的视窗并保持您的连接不变。现在您可以有一个单独的视图控制器来管理它,而无需添加任何代码。如果视图非常复杂,或者如果你想根据需要延迟加载它,你真的只需要一个单独的 Nib,比如用户可以为主窗口选择不同的视图。

【讨论】:

谢谢弗朗西斯!关于为什么 CustomImageViewController.m 视图属性(到 CustomImageViewController.nib 中的视图)连接被 MainMenu.nib 中的连接覆盖的更多信息? 我在回答中添加了一些解释。在这种情况下,您可能不想使用单独的 Nib,除非您的应用程序比看起来更复杂。您应该能够在 MainMenu 中设计所有内容。【参考方案2】:

我删除了我之前的答案,因为我认为您正在为 ios 设备开发。现在我意识到它是一个标准的 Mac OS 项目。但无论如何,我所说的关于设置初始视图控制器的内容保持不变。好的,你有一个自定义的 NSViewController 对象,它有一个 NSView 对象。直到这里都很好。但是,应用程序如何知道它启动时要显示什么视图。您应该将初始视图设置为 NSViewController 的视图,或者将初始视图控制器设置为 NSViewController 对象本身,以便它知道在开始时要显示什么。如果它那么简单,我希望看到你的项目。只需将其发送到我的电子邮件。

【讨论】:

嗨,Mikayil,这里是示例项目的链接,NSViewController 子类来自 Apple 示例,SPAppDelegate.m/.h 基本上是 vanilla XCode 模板。我刚刚修改了 MainMenu.xib。链接:mediafire.com/?fodletn93e1ykub 亲爱的@bustaa,很抱歉这么晚才上传编辑过的代码,但我太忙了,没时间。虽然我毫不怀疑你已经解决了这个问题只是为了一点礼貌这里是固定项目的链接:mediafire.com/?f10km6w8ww9eo9r 我只是在 applicationDidFinishLaunching 方法中添加了一些代码

以上是关于NSViewController 和界面生成器的主要内容,如果未能解决你的问题,请参考以下文章

NSViewController 用户界面状态恢复

为 Lion 的用户界面恢复功能编码 NSViewController

Cocoa:NSViewController 视图中的设置器

osx:在 NSWindowController 和 NSViewController 之间进行委托

交换视图 - NSWindowController 和 NSViewController(s)

跨多个 NSViewController 和 XIB 拆分 NSTabView