自定义沙盒化的NSSavePanel警报

3
我正在使用代理的panel(_:validate)方法从NSSavePanel中验证url,如果url无效则会抛出错误。这种情况下,NSSavePanel会显示一个警报,并且我想根据抛出的错误自定义(即提供一些易读的描述),使保存面板窗口保持打开状态,然后让您选择另一条路径。
当不使用App Sandbox时,LocalizedError运行良好,但在沙盒应用程序中,错误描述的getter从未被调用,警报中的消息是通用的“Operation couldn't be completed. (#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"
        }
    }
}

请在问题中添加您的代码和文件访问设置。 - Willeke
@Willeke 好的,船长! - Hubert Smazak
1个回答

4

经过进一步的挖掘,我终于找到了这个谜语的解决方案,尽管我只能猜测苹果为什么要将它变得棘手。显然,NSError 是必须使用的。定制必须在 userInfo 中完成,比如说:

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

顺便说一下,子类化NSError是不起作用的,沙盒会忽略你 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接