swift + OS X 沙盒:将'NSVBOpenPanel'视为'NSOpenPanel' :: 因为我需要在委托方法中获取发件人



我使用swift,并显示NSOpenPanel。在代理中,我需要查看发件人的提示,以区分要采取的操作:

例如

func show() {
    ... 
    panel.delegate = self
    panel.prompt = "xy"
    panel.run ....
}
func show2() {
    ... 
    panel.delegate = self
    panel.prompt = "abc"
    panel.run ....
}
//delegate
func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool {
    let panelPrompt = (sender as! NSOpenPanel).prompt       ... 
}
  • 无沙盒=工作良好

    • 委托的发送方实际上是NSOpenPanel
  • with sandbox=Cast失败,导致崩溃

    • 委托的发送方不是NSOpenPanel,而是NSVBOpenPanel。苹果的私人类可以远程与外界对话,并允许用户选择通常不在沙盒中的文件。(有关详细信息,请参阅苹果的沙箱指南)

所以问题是,我如何在不崩溃的情况下使用swift
有没有好的方法,或者只是一个错误/丑陋的idk行为
我必须恢复使用performSelector吗

===

附加:NSOpenPanel的扩展也不起作用!

而不是将发送方强制转换为NSOpenPanel(由于发送方是私有CCD_ 2类的实例),或者一些performSelector魔术,你可以使用这样一个事实可以在AnyObject上访问任意方法和属性不强制转换,并且该调用的行为类似于展开可选:

func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool {
    let panelPrompt = sender.prompt ?? ""
    // ...
    return true
}

这将提示任何具有promptsender对象属性,并将空字符串作为回退。在我的测试中,它运行良好在沙盒环境中。

参见Swift的怪异行为;s AnyObject获取更多详细信息、示例和对文档

这就是它与performSelector的工作方式。但它相当丑陋:

let panelPromptUnmanaged = (sender as! NSObject).performSelector(NSSelectorFromString("prompt"))
let panelPrompt = panelPromptUnmanaged != nil ? panelPromptUnmanaged.takeRetainedValue() as! String : ""

最新更新