如何从其他类访问Document.swift中的CoreData相关实例变量?
访问Document类中变量的几种方法
嘿,要从其他类访问Document.swift里的defaultSpaceLocation和currentSpaceLocation这两个变量,我给你分享几个常用的靠谱办法:
传递Document实例引用(推荐优先用这个)
最简单直接的方式就是在初始化其他类的时候,把当前活跃的Document对象传进去,存成这个类的属性,之后就能随时访问了。举个例子,假设你有个SpaceEditViewController需要用到这些变量:class SpaceEditViewController: UIViewController { // 存一份Document的引用 var document: Document? override func viewDidLoad() { super.viewDidLoad() // 直接访问变量 if let location = document?.defaultSpaceLocation { // 在这里使用location做操作 } } } // 在创建这个ViewController的地方传递Document实例 let editVC = SpaceEditViewController() editVC.document = currentActiveDocument // 这里的currentActiveDocument就是你的Document实例这种方式耦合度低,逻辑清晰,是最推荐的做法。
通过文档控制器获取当前活跃的Document(适合文档类App)
如果你的App是基于NSDocument(macOS)或者UIDocument(iOS)的文档型应用,可以通过系统的文档控制器来获取当前正在编辑的Document实例:// macOS下的写法 if let currentDoc = NSDocumentController.shared.currentDocument as? Document { let defaultLocation = currentDoc.defaultSpaceLocation let currentLocation = currentDoc.currentSpaceLocation // 做后续操作 } // iOS下如果用了UIDocument,可以从场景或视图关联中获取 // 比如在视图控制器中,如果是通过文档模板打开的,可以这样取 if let document = self.document as? Document { let location = document.currentSpaceLocation }全局存储Document引用(谨慎使用)
如果你实在没办法传递引用或者通过控制器获取,可以考虑把Document实例存在全局可访问的地方,比如AppDelegate或者一个单例类里。但这种方式会增加代码耦合,多文档场景下容易出问题,所以尽量少用:// 在AppDelegate里加个属性 class AppDelegate: UIResponder, UIApplicationDelegate { var currentDocument: Document? // ...其他代码 } // 在Document的生命周期方法里赋值,比如makeWindowControllers(macOS)或者didLoad(iOS) override func makeWindowControllers() { let windowController = NSWindowController(window: NSWindow()) addWindowController(windowController) // 把当前实例存到AppDelegate if let appDelegate = NSApplication.shared.delegate as? AppDelegate { appDelegate.currentDocument = self } } // 其他类里访问 if let appDelegate = NSApplication.shared.delegate as? AppDelegate, let document = appDelegate.currentDocument { let location = document.defaultSpaceLocation }
内容的提问来源于stack exchange,提问作者Łukasz
相关产品推荐
相关产品推荐

