【问题标题】:Customizing sandboxed NSSavePanel alert自定义沙盒 NSSavePanel 警报
【发布时间】:2018-08-21 09:26:59
【问题描述】:

我正在使用委托的 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"
        }
    }
}

【问题讨论】:

  • 请将您的代码和文件访问设置添加到问题中。
  • @Willeke ayay 队长!

标签: swift macos nsopenpanel nssavepanel


【解决方案1】:

所以,经过一番进一步的挖掘,我终于可以说出谜语的解决方案了,尽管我只能猜测为什么它被 Apple 弄得很棘手。显然 NSError 只需要使用。自定义必须在 userInfo 中完成,比如说

let userInfo = [NSLocalizedDescriptionKey: "yourLocalizedDescription", NSLocalizedRecoverySuggestionErrorKey: "yourSuggestion"]
throw NSError(domain: "whatever", code: 0, userInfo: userInfo)

等等。顺便说一下子类化 NSError 不起作用,沙盒会很高兴地忽略你:)

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多