这些天,我开发了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!?”)。当我点击关闭按钮时它会这样做。你知道我做错了吗?
感谢您的帮助。
答案 0 :(得分:1)
模态并不意味着显示在顶部。模态意味着阻止用户与除此之外的任何其他内容进行交互。它通过创建一个新的运行循环来实现这一点,这意味着在模式窗口关闭之后,runModelForWindow之后的任何内容都不会发生。正是您在NSLog上看到的。
您可能不希望使用模态窗口进行首选项。 OSX的惯例是当首选项窗口打开时,主应用程序窗口保持活动状态。
如果您只想将窗口置于前面,并且不关心用户是否稍后点击主窗口将其置于前面,则在您拥有的窗口上使用-makeKeyAndOrderFront
。另一方面,如果您希望此首选项窗口始终位于前面,则将其设置为NSPanel而不是NSWindow。