如何在 UISplitviewController 的主体和细节之间共享数据模型?

How to share a datamodel between the master and detail of UISplitviewController?

我有一个 DataModelController class,我的 splitviewcontroller 的 masterdetail 需要同时访问。问题是我不能只在它们中的每一个中创建一个实例,因为我需要两个数据模型相同

我可以在 master 中创建一个 DataModelController 对象,然后在 detail 中引用它,但我不知道如何从代码中访问它。

我的架构是:

                   / NavigationController (detail) - ViewController
Splitviewcontroller
                   \ NavigationController (master) - CollectionViewController

我正在使用 Xcode 和 Swift。

由于这里要求的是代码的最小版本,详情:

class PageViewController: UIViewController {
    // I need to set this to the dataModelController of NotePreviewCollectionViewController
    var dataModelController: DataModelController!
}

和师傅:

class NotePreviewCollectionViewController: UICollectionViewController {
    let dataModelController = DataModelController()
}

共享数据的最简单方法是让数据照管自己的生命周期,而不是将其绑定到使用它的class实体。

class DataModelController {
    static let instance = DataModelController()
    private init() {
    }
}

这样每个需要数据模型的 class 通过引用 DataModelController.instance 获得一个一致的版本。

我不能说得太具体,但这里有一种使用授权的方法:

代表

protocol ModelDelegate {
    func updateModel(object: Any) // Make this whatever type you need
}

硕士

class MasterViewController: UICollectionViewController, ModelDelegate {
    var detailViewController: DetailViewController? = nil
    let dataModelController = DataModelController()

    func updateModel(object: Any) {
        // this will be called from Detail controller
        // Update model
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showDis etail" {
            let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
            controller.dataModelController = dataModelController
            controller.modelDelegate = self
            detailViewController = controller
        }
    }
}

详情

class DetailViewController: UIViewController {
    var dataModelController: DataModelController!
    var modelDelegate: ModelDelegate?   
    // Whenever you want to update your model
    modelDelegate?.update(object: obj) // Pass changes back to Master
}

您在这里所做的是将您的数据(部分或整个对象)的引用传递给您的 Detail Controller。每当你想更新模型时,调用委托。