【问题标题】:When is the NSApp's keyWindow created?NSApp 的 keyWindow 是什么时候创建的?
【发布时间】:2011-07-11 02:49:52
【问题描述】:

keyWindow 什么时候创建?

我认为 NSWindow 会在调用相应视图控制器的 updateView 方法之前创建(我调用该方法以响应 awakeFromNib),但是如果我使用 NSApp 的 keyWindow 创建警报表,它不会正确显示。

但是,如果我在该视图上放置一个按钮,然后在用户单击它时显示警报,则定义了 keyWindow,并且警报正确显示(如预期的那样)。

我的应用程序委托几乎是空的。

我实际上并不想在启动时显示警报,但我确实想知道何时设置了键窗口。 :)

【问题讨论】:

    标签: cocoa osx-snow-leopard


    【解决方案1】:

    keyWindow 什么时候创建?

    -[NSApp keyWindow] 指向当前作为关键窗口的现有窗口(例如,已从 nib 文件加载的窗口),通常通过发送-makeKeyAndOrderFront:

    当应用程序启动时,Cocoa:

    1. 加载主 nib 文件;
    2. 取消归档 nib 文件的内容并实例化其对象;
    3. 重新建立在 nib 文件中定义的连接;
    4. -awakeFromNib 发送到 nib 文件对象(的子集);
    5. 显示已标记为在启动时可见的窗口;

    Resource Programming Guide 中所述。

    如果 nib 文件包含单个窗口,则该窗口会在显示时成为关键窗口,前提是它可以成为关键窗口,这发生在 -awakeFromNib 已发送之后。

    另外,the documentation for -[NSApplication keyWindow] 声明:

    如果应用程序的 nib 文件尚未完成加载或接收器未处于活动状态,此方法可能会返回 nil

    【讨论】:

    • 如果 nib 文件包含许多窗口,但默认情况下只有一个窗口可见怎么办?其他控制器应该如何在不需要知道 nib 文件是否已完成加载的情况下引用主窗口或键窗口? (我现在正在尝试在各个窗口控制器上使用 windowDidLoad 事件,但它们没有被触发)。
    • stackoverflow.com/questions/2695671/… 或多或少地回答了评论中的那些后面的问题,因此接受您的回答,因为它很好地回答了原始问题。
    • @Ara NSApplicationNSWindow 发布一些可用于协调此问题的通知。您可以收听这些通知,也可以使用NSApplicationDelegateNSWindowDelegate 中的相应方法。也许这需要另一个问题,其中包含有关您的架构和预期行为的更多详细信息。
    • 我应该多看看 NSApplicationDelegate。我正在查看 NSWindow 通知,但它们并没有被解雇。可能是因为作为笔尖的一部分加载。
    猜你喜欢
    • 2013-11-24
    • 2016-10-07
    • 2014-12-08
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多