自定义沙盒NSSavePanel警报

时间:2018-08-21 09:26:59

标签: swift macos nsopenpanel nssavepanel

我正在使用代理人的panel(_:validate)方法验证来自NSSavePanel的网址,如果网址无效,则会引发错误。在这种情况下,NSSavePanel会显示一个警报,我要根据抛出的错误进行自定义(意味着提供一些易于理解的描述),保持保存面板窗口处于打开状态,然后让您选择其他路径。

LocalizedError在不使用应用程序沙箱时可以正常工作,但是在沙盒应用程序中,永远不会调用错误描述的获取器,并且警报中的消息是通用的“操作无法完成。(#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"
        }
    }
}

1 个答案:

答案 0 :(得分:1)

因此,在进一步挖掘之后,我终于可以说出谜语的解决方案了,尽管我只能猜出Apple为何将其变得棘手的原因。显然,仅需要使用 NSError 。自定义必须在userInfo中完成,例如

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

等顺便说一句,NSError的子类化无法正常工作,沙盒会很高兴地忽略您:)