我想知道是否有办法继承 NSSavePanel。或者,如果您要创建一个虚拟对象,您将如何模仿 NSSavePanel 的 beginSheetModalForWindow:CompletionHandler 函数?
-(void)beginSheetModalForWindow:(NSWindow *)window completionHandler:(void (^)(NSInteger *))handler{
在 .m 类文件中实现函数时,我对如何实现块处理程序一无所知。
我想知道是否有办法继承 NSSavePanel。或者,如果您要创建一个虚拟对象,您将如何模仿 NSSavePanel 的 beginSheetModalForWindow:CompletionHandler 函数?
-(void)beginSheetModalForWindow:(NSWindow *)window completionHandler:(void (^)(NSInteger *))handler{
在 .m 类文件中实现函数时,我对如何实现块处理程序一无所知。
简短的回答:没有
更长的答案:这里是龙
这是可能的,但东西可能会坏掉。您还可以使用类别添加方法,它们可能有效,也可能无效。问题的出现是由于实现 NSOpenPanel 以支持 App Sandbox 的方式 - 各种诡计正在幕后进行,甚至只是调用类上现有方法的便利类别方法可能导致 OS X 报告错误,并且对话框不报告出现。NSOpenPanel 是一个微妙的生物,应该尽可能少地触摸它,并且只需要非常小心。
将 NSOpenPanel 实例包装在另一个类中是另一回事,根本不应该打扰它。走那条路。
附录回复:评论
的声明beginSheetModalForWindow
是:
- (void)beginSheetModalForWindow:(NSWindow *)window completionHandler:(void (^)(NSInteger result))handler
完成处理程序传递一个值,指示按下了哪个按钮。要采取行动依赖于你可以使用一个标准if
:
NSOpenPanel *openPanel;
NSWindow *hostWindow;
...
[openPanel beginSheetModalForWindow:hostWindow
completionHandler:^(NSInteger returnCode)
{
if (returnCode == NSFileHandlingPanelOKButton)
{
// OK pressed
...
}
else
{
// Cancel pressed
...
}
}
];