2012-05-23 52 views
4

我已經把它分解成一個非常小的項目。在應用程序代理中使用以下代碼:Cocoa:在NSApp beginSheet結果隱藏主窗口後顯示一個錯誤

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    TestingWindowController * testingWindowController = [[TestingWindowController alloc] initWithWindowNibName: @"TestingWindowController"]; 

    // Begin our sheet 
    [NSApp beginSheet: testingWindowController.window 
     modalForWindow: self.window 
     modalDelegate: self 
     didEndSelector: @selector(windowDidEnd:returnCode:contextInfo:) 
      contextInfo: NULL]; 
} 

- (void)windowDidEnd:(id)alert returnCode:(NSInteger)returnCode contextInfo:(id) contextInfo 
{ 
    // If the user did not accept, then we really don't care what else they did! 
    if (returnCode != NSOKButton) return; 

    // We have had an error. Display it. 
    [[NSApplication sharedApplication] presentError: nil 
            modalForWindow: self.window 
              delegate: nil 
           didPresentSelector: nil 
             contextInfo: NULL]; 
} 

並將以下操作綁定到windows nib上的按鈕。 (請注意,筆尖的窗口也設置爲在啓動時不可見)。

- (IBAction) onClose: (id) sender 
{ 
    [[NSApplication sharedApplication] endSheet: self.window 
            returnCode: NSOKButton]; 

    [self.window orderOut: nil];  
} // End of onClose 

什麼結束了發生的事情是,有一次我的onClose運行,所有窗口的消失,我一無所有,但錯誤對話框(主窗口已經消失)。 Error dialog with no main window

我的代碼有問題嗎?爲什麼我的主窗口消失?

注意:我知道我沒有將錯誤傳遞給presentError方法。我故意留下這個空值,因爲我只有很短的時間來編寫示例代碼。傳遞實際錯誤會導致相同的行爲。

示例項目可用here

回答

1

您正在使用2種方法打開窗口beginSheet:.....和runModalForWindow :.你只需要其中的一個。如果你想要一個表單附加到你的窗口,使用第一種方法,如果你想要一個獨立的窗口,使用第二個。同樣,在你的onClose方法中,你應該使用endSheet:returnCode:如果你正在關閉一個工作表(該方法的參數應該是testingWindowController.window而不是self.window),並且stopModalWithCode:如果你正在關閉一個模式窗口,你不應該有兩個。

+0

謝謝(取消發射時的UserLoginWindowController窗口總是可見)

- (IBAction)userButtonPressed:(id)sender { UserLoginWindowController * wc = [UserLoginWindowController new]; // we keep a reference, so the WC doesn't deallocate self.modalWindowController = wc; [[self window] beginSheet:[wc window] completionHandler:^(NSModalResponse returnCode) { self.modalWindowController = nil; }]; } 

,但不幸的是它並沒有解決問題。我嘗試過使用'beginSheet'和'endSheet'方法,但我仍然遇到同樣的問題。 (主窗口消失)。 – Kyle

+0

@Zenox:編輯過的代碼仍然顯示你在onClose方法中關閉了錯誤的窗口 - testingWindowController.window是你想要結束的表單,並且不是self.window – rdelmar

+0

onClose方法在TestingWindowController中(它的點擊面板上按鈕的選擇器)。所以self.window將適合這種情況下,它會不會? – Kyle

4

看起來你還在使用舊的API,嘗試新的

在UserLoginWindowController

- (IBAction)cancelButtonPressed:(id)sender { 

    [[[self window] sheetParent] endSheet:[self window] returnCode:NSModalResponseCancel]; 

} 
+0

是的。較新的基於塊的API將爲您節省很多頭痛。在10.10上,你還可以使用故事板來簡化它。 (如果你想跳進那個) – uchuugaka