我想知道是否有子类化NSSavePanel的方法。或者,如果您要创建一个虚拟对象,您将如何模仿NSSavePanel的beginSheetModalForWindow:CompletionHandler函数?

-(void)beginSheetModalForWindow:(NSWindow *)window completionHandler:(void (^)(NSInteger *))handler{


在实现.m类文件中的功能时,我不介绍如何实现块处理程序。

最佳答案

简短答案:否

更长的答案:龙在这里

有可能,但是东西可能会破裂。您也可以使用类别添加方法,这些方法可能有用,也可能无效。问题的出现是由于实现了NSOpenPanel来支持App Sandbox的方式-各种琐事在幕后进行,甚至只是在类上调用现有方法的便利类方法也可能导致OS X报告错误,并且对话框无法报告错误。出现。 NSOpenPanel是一种精致的生物,应尽可能少地触摸它,并且要始终小心翼翼。

在另一个类中包装NSOpenPanel实例是另一回事,完全不应该使它烦恼。走那条路。

附录re:评论

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
                                          ...
                                       }

                                    }
];

10-07 12:52
查看更多