我正在使用委托面板( NSSavePanel )方法验证来自_:validate的url,在出现无效url的情况下抛出错误。在这种情况下,NSSavePanel会显示一个警报,我希望根据抛出的错误进行自定义(意思是提供一些人类可读的描述),保持保存面板窗口打开,然后让您选择另一条路径。
当不使用and时,LocalizedError工作得很好,但在沙箱应用程序中,错误描述的getter从未被调用,警报中的消息是“操作无法完成。(#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"
}
}
}发布于 2018-08-24 01:21:25
因此,经过进一步的挖掘,我终于可以说出谜团的答案了,尽管我只能猜测为什么苹果让这个谜团变得棘手。显然,只需要使用NSError。定制必须在userInfo中完成,比如
let userInfo = [NSLocalizedDescriptionKey: "yourLocalizedDescription", NSLocalizedRecoverySuggestionErrorKey: "yourSuggestion"]
throw NSError(domain: "whatever", code: 0, userInfo: userInfo)等等。顺便说一句,子类NSError不起作用,沙箱会很高兴地忽略您:)
https://stackoverflow.com/questions/51945594
复制相似问题