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