我正在使用委托的panel(:validate)方法验证nssavepanel中的URL,在URL无效的情况下引发错误。在这种情况下,nssavepanel会显示一个警报,我希望根据抛出的错误对其进行自定义(这意味着提供一些人类可读的描述),使保存面板窗口保持打开状态,然后让您选择其他路径。
LocalizedError在不使用应用程序沙盒但在沙盒应用程序中工作正常,永远不会调用用于错误描述的getter,并且警报中的消息是Generic“操作无法完成”。(YourErrorType)”,我猜这是由沙盒NSsavePanels的不同继承链造成的。
我正在努力找到解决这个问题的方法——是否可以在保持应用程序沙盒的同时,以某种方式自定义警报?
附录:用户选择的文件的权限=>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"
        }
    }
}

最佳答案

所以,经过一番深入的挖掘,我终于知道了这个谜语的答案,尽管我只能猜测为什么苹果会让这个谜语变得棘手。显然只需要使用nserrror。定制必须在用户信息中完成,比如

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

等等。由于nserrror子类不起作用,沙盒会很高兴地忽略您:)

关于swift - 自定义沙盒NSSavePanel警报,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51945594/

10-10 13:13