5

我把它分解成一个非常小的项目。在应用程序委托中使用以下代码:

- (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 笔尖上的按钮相关联。(请注意,笔尖的窗口也设置为在启动时不可见)。

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

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

最终发生的是,一旦我onClose运行,所有窗口都消失了,我只剩下错误对话框(主窗口消失了)。没有主窗口的错误对话框

我的代码有问题吗?为什么我的主窗口消失了?

注意:我知道我没有将错误传递给 presentError 方法。我故意留下这个空值,因为我只有很短的时间来编写示例代码。传递实际错误会导致相同的行为。

示例项目可在此处获得。

4

2 回答 2

5

看来你还在用旧的api,试试新的

(取消选择 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;
    }];

}

在用户登录窗口控制器中

- (IBAction)cancelButtonPressed:(id)sender {

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

}
于 2014-09-16T13:51:03.513 回答
1

您正在使用 2 种方法打开窗口,beginSheet:..... 和 runModalForWindow:。你只需要其中之一。如果您想在窗口上附加一张纸,请使用第一种方法,如果您想要一个独立的窗口,请使用第二种方法。同样,在您的 onClose 方法中,您应该使用 endSheet:returnCode: 如果您正在关闭工作表(该方法的参数应该是 testingWindowController.window 而不是 self.window),并且 stopModalWithCode: 如果您正在关闭模式窗口,你不应该两者兼得。

于 2012-05-24T00:37:49.220 回答