是否可以对NSSavePanel进行子类化



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

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

在 .m 类文件中实现函数时,我正在了解如何实现块处理程序。

简短回答:否

更长的答案:这里是龙

这是可能的,但东西可能会坏掉。您还可以使用类别添加方法,它们可能有效,也可能无效。问题是由于NSOpenPanel实现以支持应用程序沙箱的方式而出现的 - 各种诡计在幕后进行,甚至只是调用类上现有方法的便利类别方法都可能导致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
                                          ...
                                       }
                                    }
];

最新更新