swift + OS X 沙箱:将 'NSVBOpenPanel' 视为 'NSOpenPanel' :: 因为我需要在委托方法中获取发件人
swift + OS X sandboxing: treat 'NSVBOpenPanel' as a 'NSOpenPanel' :: because I need to get the sender in the delegate method
我正在使用 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。 Apple 的私有 class 远程与外界对话并允许用户选择通常不在您的沙盒中的文件。 (有关详细信息,我参考了苹果的沙盒指南)
所以问题是我如何在 swift 中使用它而不会崩溃?
有什么好的方法还是只是 bug/ugly idk 行为
我必须恢复使用 performSelector 吗?
===
补充:NSOpenPanel 的扩展也不起作用!
这就是它与 performSelector 一起工作的方式。虽然很丑:
let panelPromptUnmanaged = (sender as! NSObject).performSelector(NSSelectorFromString("prompt"))
let panelPrompt = panelPromptUnmanaged != nil ? panelPromptUnmanaged.takeRetainedValue() as! String : ""
而不是将发件人转换为 NSOpenPanel
(这失败了,因为
sender 是私有实例 NSVBOpenPanel
class),
或者一些 performSelector
魔法,你可以使用这样的事实
可以在 AnyObject
上访问任意方法和属性
没有转换,并且调用的行为类似于隐式
展开可选:
func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool {
let panelPrompt = sender.prompt ?? ""
// ...
return true
}
这给出了 any sender
对象的提示,该对象具有 prompt
属性,空字符串作为回退。在我的测试中它运作良好
在沙盒环境中。
有关更多详细信息、示例和参考资料,请参阅
文档。
我正在使用 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。 Apple 的私有 class 远程与外界对话并允许用户选择通常不在您的沙盒中的文件。 (有关详细信息,我参考了苹果的沙盒指南)
所以问题是我如何在 swift 中使用它而不会崩溃?
有什么好的方法还是只是 bug/ugly idk 行为
我必须恢复使用 performSelector 吗?
===
补充:NSOpenPanel 的扩展也不起作用!
这就是它与 performSelector 一起工作的方式。虽然很丑:
let panelPromptUnmanaged = (sender as! NSObject).performSelector(NSSelectorFromString("prompt"))
let panelPrompt = panelPromptUnmanaged != nil ? panelPromptUnmanaged.takeRetainedValue() as! String : ""
而不是将发件人转换为 NSOpenPanel
(这失败了,因为
sender 是私有实例 NSVBOpenPanel
class),
或者一些 performSelector
魔法,你可以使用这样的事实
可以在 AnyObject
上访问任意方法和属性
没有转换,并且调用的行为类似于隐式
展开可选:
func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool {
let panelPrompt = sender.prompt ?? ""
// ...
return true
}
这给出了 any sender
对象的提示,该对象具有 prompt
属性,空字符串作为回退。在我的测试中它运作良好
在沙盒环境中。
有关更多详细信息、示例和参考资料,请参阅