【问题标题】:How to properly set up NSPopover with separate viewController如何使用单独的 viewController 正确设置 NSPopover
【发布时间】:2013-07-08 04:51:55
【问题描述】:

我创建了一个非常简单的测试程序。它有一个按钮。单击该按钮会弹出一个带有标签的NSPopover。该标签位于单独的 xib 文件中,具有自己的 NSViewController

目标是,当我在主屏幕上单击按钮时,弹出窗口将显示viewcontroller 的 xib 文件。并且 xib 文件的标签应将其文本设置为“It works”。

嗯.. 它可以工作,但仅在第二次加载弹出框之后。在第一次单击按钮时,标签仍具有其旧的默认值。但是从第 2 次点击开始,“它起作用了”。 有没有人知道是什么导致了这个问题?它只有大约 5 行代码 代码可以在这个仓库中看到 --> https://github.com/patchthecode/testtest

【问题讨论】:

    标签: objective-c cocoa interface-builder nspopover


    【解决方案1】:

    - (void)windowDidLoad 方法中调用[mainScreenPopoverViewController view];。这会将您的视图加载到内存中。

    调用[mainScreenPopoverViewController view];之前(文本字段地址为0x0)

    您不应该对所有 IBOutlet 使用强属性。

    @property (nonatomic, strong) IBOutlet NSTextField *textField;
    

    看看Resource Programming Guide

    从实用的角度来看,在 iOS 和 OS X 插座中应该 定义为声明的属性。插座一般应该是弱的, 除了从文件所有者到 nib 文件中的顶级对象的那些 (或者,在 iOS 中,故事板场景)应该很强大。网点 因此,您创建的通常应该很弱,因为:

    • 您为视图控制器的视图或视图的子视图创建的 Outlets 例如,窗口控制器的窗口是任意引用 在不暗示所有权的对象之间。

    • 强大的出口经常由框架类指定(例如, UIViewController 的视图出口,或 NSWindowController 的窗口 出口)。

    【讨论】:

    • 嗨,好的,我知道强/弱 IBoutlets。我的错误。我刚刚做了这个测试应用程序,所以显示了弹出代码。有一件事,解决方案有效,但是否有一些链接可以解释为什么会这样?我相信 nib 加载代码已经将对象实例化到内存中..
    • 使用断点 un IBAction 并检查文本字段的地址。
    • 当我设置断点时,我明白现在发生了什么。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多