NSApplication endSheet:无效

tom*_*ple 13 macos cocoa objective-c nsapplication

好的,这真的让我很难过:

我在窗口上创建一个模态表格

-(IBAction) login: (id) sender {
[NSApp beginSheet:loginWindow 
   modalForWindow:window 
    modalDelegate:nil 
   didEndSelector:nil 
      contextInfo:nil];
}
Run Code Online (Sandbox Code Playgroud)

并试着删除它

-(IBAction) loginWindowCancelPressed:   (id) sender {
debugLog(@"cancel");
[NSApp endSheet:loginWindow];
}
Run Code Online (Sandbox Code Playgroud)

但它仍然存在.

我已经检查了所有明显的事情,比如IB连接,并确保window和loginWindow存在且处于正常状态.

所以,问题是:我错过了什么吗?

mip*_*adi 19

您必须为工作表设置委托.委托应该实现一个带有如下签名的方法:

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo;
Run Code Online (Sandbox Code Playgroud)

(如果您愿意,可以使用其他名称,但它应该接受相同的参数.)

您可以在该方法中执行任何操作,但最终应该以:

[sheet orderOut:self];
Run Code Online (Sandbox Code Playgroud)

这会解雇表格.

  • 你实际上并不需要委托(它是可选的).唯一缺少的是对orderOut的调用: (2认同)

小智 5

请参阅:在 Cocoa Objective-c 中创建模态对话框或窗口?

不需要代表。以下内容适用于我解雇并允许稍后回拨:

[NSApp endSheet: loginWindow];
[loginWindow orderOut:self];
Run Code Online (Sandbox Code Playgroud)