我使用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
}
这将提示任何具有prompt
的sender
对象属性,并将空字符串作为回退。在我的测试中,它运行良好在沙盒环境中。
参见Swift的怪异行为;s AnyObject获取更多详细信息、示例和对文档
这就是它与performSelector的工作方式。但它相当丑陋:
let panelPromptUnmanaged = (sender as! NSObject).performSelector(NSSelectorFromString("prompt"))
let panelPrompt = panelPromptUnmanaged != nil ? panelPromptUnmanaged.takeRetainedValue() as! String : ""