我使用 swift 并展示了一个 NSOpenPanel。在委托中,我需要查看发送者的提示来区分要采取的操作:
e.g.
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,而是 NSVBOpenPanel。 Apple 的私人课程,可远程与外界对话,并允许用户选择通常不在沙箱中的文件。 (详细信息我参考苹果的沙盒指南)
所以问题是我如何快速使用它而不崩溃?
有没有好的方法或者只是一个错误/丑陋的 idk 行为
我必须恢复使用performSelector 吗?
===
另外:NSOpenPanel 的扩展也不起作用!
而不是将发送者强制转换为NSOpenPanel
(失败是因为
发送者是私有的一个实例NSVBOpenPanel
班级),
或一些performSelector
魔法,你可以利用这个事实
可以访问任意方法和属性AnyObject
无需铸造,并且调用的行为就像隐式
展开可选:
func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool {
let panelPrompt = sender.prompt ?? ""
// ...
return true
}
这会提示any sender
对象有一个prompt
属性,以及空字符串作为后备。在我的测试中效果很好
在沙盒环境中。
See Swift 的 AnyObject 的奇怪行为 https://stackoverflow.com/questions/33388830/the-strange-behaviour-of-swifts-anyobject有关更多详细信息、示例和参考资料
文档。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)