我需要打开一个模态窗口,它可以打开另一个模态窗口(或工作表)。第一个窗口工作正常,但第二个窗口表现奇怪。
这是我打开第一个窗口的方式:
RegisterDialog * registerDialog=[[RegisterDialog alloc] initWithWindowNibName:@"RegisterDialogMac"];
NSWindow* window = [registerDialog window];
[NSApp runModalForWindow:window];
这个窗口行为正常,并响应任何按钮,我只是添加了一点代码,以停止模态事件循环后按下一个红色按钮:
- (void)windowWillClose:(NSNotification *)notification {
[[NSApplication sharedApplication] stopModal];
}
Ok。现在我打开第二个对话框窗口,如果用户按下"注册"按钮:
-(IBAction)registerPressed:(id)sender {
RegistrationDialogMac* registrationDialog=[[RegistrationDialogMac alloc] initWithWindowNibName:@"RegistrationDialogMac"];
NSWindow* window = [registrationDialog window];
[NSApp runModalForWindow:window];
}
第二个对话框窗口也可以正常工作,但只有按下红色按钮时才会关闭。
这就是取消"按钮已处理:
-(IBAction)cancelPressed:(id)sender {
[NSApp stopModal];
[[self window] close];
}
按下它后,模态事件循环停止,第一个对话框窗口变为活动窗口,但第二个窗口仍然保持在这里。只有我按下红色按钮,它才会关闭。这很奇怪,因为第一个模态窗口是由相同的代码正确关闭的。
Ok。我尝试走不同的路线,并运行第二个对话框窗口作为一个工作表:
-(IBAction)registerPressed:(id)sender {
RegistrationDialogMac* registrationDialog=[[RegistrationDialogMac alloc] initWithWindowNibName:@"RegistrationDialogMac"];
NSWindow* window = [registrationDialog window];
[self.window beginSheet: window
completionHandler:^(NSModalResponse returnCode) { }
];
}
(我关闭了"启动时可见"正确绘制附在第一个对话框窗口上的工作表)这样将绘制第二个对话框窗口,但忽略所有按钮的按下。图形按钮被按下,但没有被处理。这段代码:
-(IBAction)cancelPressed:(id)sender {
NSLog(@"!");
[[self window] close];
//[NSApp endSheet:[self window]]; // may be this would be correct way to close sheet? Don't know as this method isn't run anyway
}
根本不执行,没有单独的"!"日志中的字符。
所以我做错了什么。实际上我几乎没有任何Mac编程经验,只有Windows。
发现第二个对话框的[self window]
是nil
,所以它不能响应close
。检查了.xib -是的,我忘记将window
出口连接到窗口本身。修复,窗口现在正确关闭。
这并不能解决当第二个对话框被绘制为工作表时按钮无响应的问题。