NSWindow beginSheet completionHandler未调用

时间:2014-08-01 05:54:06

标签: macos cocoa nsview nswindow nswindowcontroller

我在主窗口中显示一张纸。我使用以下代码展示工作表:

AddContactWindowController *addContact = [[AddContactWindowController alloc] initWithWindowNibName:@"AddContactWindow"];
addContact.currentViewController = myView;
self.addWindowController = addContact;

[self.view.window beginSheet: addContact.window completionHandler:^(NSModalResponse returnCode) {
    NSLog(@"completionHandler called");
}];

AddContactWindowController是NSWindowController的子类。它内部有一个视图控制器。在视图内部是一个"关闭"调用它的按钮:

[[[self view] window] close];

这会关闭窗口,但不会调用beginSheet中的completionHandler。这导致了我的问题。

是否有任何特殊方式我们应该关闭NSWindow表以便成功调用完成处理程序?我也试过[[[self view] window] orderOut:self],但这也不起作用。

感谢。

2 个答案:

答案 0 :(得分:6)

您需要在窗口上调用-endSheet:returnCode:,而不是仅仅将其命令。

答案 1 :(得分:2)

您必须正确完成模态会话。

我曾经调用- (void)performClose:(id)sender并在委托方法中停止模态会话。

- (void)windowWillClose:(NSNotification *)notification {
    [NSApp stopModal];
}

但是对于工作表,endSheet看起来更合适。

self.addWindowController = addContact;

[self.view.window beginSheet:self.addWindowController.window];
...
...
[self.view.window endSheet:self.addWindowController.window];

self.addWindowController = nil