如何在 UISplitviewController 的主体和细节之间共享数据模型?
How to share a datamodel between the master and detail of UISplitviewController?
我有一个 DataModelController
class,我的 splitviewcontroller 的 master
和 detail
需要同时访问。问题是我不能只在它们中的每一个中创建一个实例,因为我需要两个数据模型相同。
我可以在 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。每当你想更新模型时,调用委托。
我有一个 DataModelController
class,我的 splitviewcontroller 的 master
和 detail
需要同时访问。问题是我不能只在它们中的每一个中创建一个实例,因为我需要两个数据模型相同。
我可以在 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。每当你想更新模型时,调用委托。