禁用窗口

时间:2013-05-06 23:26:42

标签: objective-c macos osx-mountain-lion

这些天,我开发了iPad应用程序。由于我已经完成了一些工作,我正在研究一个简单的OS X应用程序,看看我能走多远。

无论如何,我想要做的是显示一个Preferences窗口(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)时,此首选项窗口将重新打开。如果我再次点击它,它将关闭。如果我打开“首选项”并单击相同的按钮,则不会重新打开。有趣的是,当首选项窗口首次打开时,应用程序将不会读取NSLog(@“Hello!?”)。当我点击关闭按钮时它会这样做。你知道我做错了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

您可能不希望使用模态窗口进行首选项。 OSX的惯例是当首选项窗口打开时,主应用程序窗口保持活动状态。

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