我正在使用委托的 panel(_:validate) 方法验证来自 NSSavePanel 的 url,如果 url 无效则抛出错误。在这种情况下,NSSavePanel 会显示一个警报,我想根据抛出的错误对其进行自定义(意味着提供一些人类可读的描述),保持保存面板窗口打开,然后让您选择另一个路径。
LocalizedError 在不使用 App Sandbox 时工作得很好,但在沙盒应用程序中,永远不会调用错误描述的 getter,并且警报中的消息是通用的“操作无法完成。(#yourErrorType)”,我猜这是某种原因造成的通过沙盒 NSSavePanel 的不同继承链。
我正在努力想办法解决这个问题 - 是否可以以某种方式自定义警报,同时仍然保持应用程序沙盒化?
附录:用户选择文件的权限 => r/w。运行以下示例会生成带有/不带有沙箱的不同警报。
func runSavePanel()
{
let panel = NSSavePanel()
let delegate = SavePanelDelegate()
panel.delegate = delegate
_ = panel.runModal()
}
class SavePanelDelegate: NSObject, NSOpenSavePanelDelegate {
func panel(_ sender: Any, validate url: URL) throws {
throw CustomError.whatever
}
}
enum CustomError: LocalizedError {
case whatever
var errorDescription: String? {
get {
return "my description"
}
}
}