gpt4 book ai didi

swift - 自定义沙盒 NSSavePanel 警报

转载 作者:搜寻专家 更新时间:2023-10-31 22:54:26 25 4
gpt4 key购买 nike

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

最佳答案

因此,在进一步挖掘之后,我终于可以说出谜语的解决方案,尽管我只能猜测它被 Apple 设置为棘手的原因。显然 NSError 只需要使用。自定义必须在 userInfo 中完成,比如说

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com