2013-05-06 91 views
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)時,此首選項窗口將重新打開。如果我再次點擊它,它會關閉。如果我打開首選項並單擊相同的按鈕,它將不會重新打開。有趣的是,當首選項打開時,應用程序不會讀取NSLog(@「Hello !?」)。當我點擊關閉按鈕時它會發生。你知道我做錯了什麼嗎?

謝謝你的幫助。

回答

1

Modal並不意味着顯示在最上面。 Modal意味着阻止用戶與除此之外的其他任何事情交互。它通過創建一個新的運行循環來實現,這意味着在模式窗口關閉之後,runModelForWindow之後的任何事情都不會發生。你正在用NSLog看到什麼。

您可能不想使用模態窗口來選擇偏好。 OSX的慣例是當首選項窗口打開時主應用程序窗口保持活動狀態。

如果您只是想將窗口置於前面,並且不在乎用戶以後是否單擊主窗口將其置於前面,則在您所擁有的窗口上使用-makeKeyAndOrderFront。另一方面,如果您希望此首選項窗口始終位於前面,則將其設置爲NSPanel而不是NSWindow。

+0

謝謝。這兩個建議都不適合我的目標。如果我使用NSPanel並將樣式設置爲Utility,那麼面板將始終位於主窗口的頂部。但主窗口不會被禁用,除非我做錯了什麼。 – 2013-05-07 01:29:28

+0

好的。我知道了。我想我必須在MainMenu.xib中創建一個Preferences窗口。 – 2013-05-07 04:39:06

+0

嘗試一些OSX應用程序,特別是蘋果應用程序。您會看到,約定窗口打開時不會禁用主窗口。 並且不,在正常情況下在不同的xib中使用首選項比MainMenu優先。 – 2013-05-07 10:20:21