【问题标题】:Ambiguous reference to member 'close()'对成员“close()”的模糊引用
【发布时间】:2020-01-07 17:18:47
【问题描述】:

我正在尝试创建一个应用程序,允许用户循环浏览文件夹中的下一个/上一个文本文档文件,就像照片查看应用程序通常允许下一个/上一个图片视图一样。到目前为止,在我看来,最有效的方法是替换当前打开的窗口中的文档。 my previous question on the topic 的编辑答案表明这确实是可能的。我希望能够使用文档架构进行打开和保存;我不想概括框架,我试图保持简单。我尝试使用上一个问题中推荐的代码如下:

let prevDocument = windowController.document
let newDocument = Document(contentsOf: newURL, ofType: myDocumentType) // add do-catch
NSDocumentController.shared.addDocument(newDocument);
newDocument.addWindowController(windowController)
prevDocument.close()

但是当我这样做时,prevDocument.close() 命令给了我一个奇怪的错误“对成员'close()' 的模糊引用”。 Another thread 告诉我“当有多个同名变量/方法时会出现这种错误”。好的,但是哪些,我该如何解决?在“模糊参考”错误下,我收到两条消息:“找到这个候选者(Foundation.Stream)”和“找到这个候选者(AppKit.NSBezierPath)”。简要查看 Foundation.Stream 和 NSBezierPath 的文档表明我正在尝试使用 Foundation.Stream 而不是 NSBezierPath,但我不知道如何告诉系统(或者为什么 NSBezierPath 会参与第一名)。

【问题讨论】:

  • 尝试类型转换:if let prevDocument = windowController.document as? Document { ...}.

标签: swift macos cocoa document


【解决方案1】:

NSWindowControllerdocument 属性具有AnyObject? 类型,因此没有close 方法,编译器难以确定它可能是什么类型的对象,因此它可能有@987654325 @方法。

单击 Xcode 中 document 属性的文档(ctrl-cmd 单击)会显示 document 属性通常是 NSDocument 类型的注释,它确实具有 close 方法。类型转换值得一试:

guard let prevDocument = windowController.document as? NSDocument else {
    // ...
}

// Rest of your code

或者,如果您可以保证您的应用程序一次只管理一个文档:

guard let previousDocument = NSDocumentController.shared.documents.first else {
    // ...
    return
}

// Rest of your code

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 2019-11-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2019-11-17
    相关资源
    最近更新 更多