swift + OS X 沙箱:将“NSVBOpenPanel”视为“NSOpenPanel”:: 因为我需要在委托方法中获取发送者

2024-02-13

我使用 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
  • 使用沙箱 = 投射失败、崩溃

    • 委托的发送者不是 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(使用前将#替换为@)

swift + OS X 沙箱:将“NSVBOpenPanel”视为“NSOpenPanel”:: 因为我需要在委托方法中获取发送者 的相关文章

随机推荐