0

这些天来,我开发 iPad 应用程序。由于我已经没有要研究的主题了,所以我正在开发一个简单的 OS X 应用程序,看看我能走多远。

无论如何,我想做的是显示一个首选项窗口(PrefWindowController)。它有一个独立于 MainMenu.xib 的 xib (PrefWindowController.xib)。当它出现时,我希望主窗口在它后面。以下是我所拥有的。

// AppDelegate.m
- (void)preferencesClicked:(id)sender {
    if (!preferencesWindow) {
        preferencesWindow = [[PrefWindowController alloc] initWithWindowNibName:@"PrefWindowController"];
    }
    [preferencesWindow showWindow:self];
}

// PrefWindowController.m
- (void)windowDidLoad {
    [super windowDidLoad];

    [NSApp runModalForWindow:self.window];
    NSLog(@"Hello!?");
}

- (IBAction)closeClicked:(id)sender {

    [NSApp stopModal];
    [self close];   
}

所以我了解到我可以使用 runModalForWindow 将当前窗口放在主窗口的顶部。我遇到的问题是,当我单击关闭按钮(closeClicked)时,此首选项窗口将重新打开。如果我再次单击它,它将关闭。如果我打开首选项并单击同一个按钮,它将不会重新打开。有趣的是,当 Preferences 窗口第一次打开时,应用程序不会读取 NSLog(@"Hello!?")。当我单击关闭按钮时,它确实如此。你知道我做错了什么吗?

谢谢您的帮助。

4

1 回答 1

1

模态并不意味着显示在顶部。模态意味着停止用户与除此之外的任何其他内容进行交互。它通过创建一个新的运行循环来做到这一点,这意味着 runModelForWindow 之后的任何事情都不会发生,直到模态窗口关闭之后。正是您在 NSLog 中看到的。

您可能不想使用模式窗口作为首选项。OSX 的约定是,当首选项窗口打开时,主应用程序窗口保持活动状态。

如果您只想将窗口放在前面,而不关心用户稍后是否单击主窗口将其放在前面,那么-makeKeyAndOrderFront请在您拥有的窗口上使用。另一方面,如果您希望此首选项窗口始终位于前面,则将其设为 NSPanel 而不是 NSWindow。

于 2013-05-07T00:38:24.667 回答