Как разделить модель данных между мастером и деталями UISplitviewController? - PullRequest
1 голос
/ 30 марта 2020

У меня есть класс DataModelController, к которому одновременно должны обращаться и master, и detail моего контроллера splitview. Проблема в том, что я не могу просто создать экземпляр в каждой из них, потому что мне нужно, чтобы две модели данных были одинаковыми .

Я мог бы создать DataModelController объект в master и затем ссылаться на него в 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()
}

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Я не могу сделать это слишком конкретным c, но вот один из способов сделать это с делегированием:

Делегат

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
        }
    }
}

Detail

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
}

То, что вы здесь делаете, передает ссылку на ваши данные (либо часть, либо весь объект) вашему контроллеру деталей. Всякий раз, когда вы хотите обновить модель, позвоните делегату.

0 голосов
/ 30 марта 2020

Самый простой способ обмена данными - позволить данным следить за своим жизненным циклом, а не связывать их с классами, которые их используют.

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

Таким образом, каждый класс, которому нужна модель данных, получает одна последовательная версия, ссылаясь на DataModelController.instance.

...