如何在 Xcode 和 Swift 4 中创建具有多个视图控制器的自定义模型实例?
How can I create an instance of a custom model with multiple viewcontrollers in Xcode with Swift 4?
我是 Swift 的新手,我确信这个问题很基础,之前已经有人问过并回答过。
我没有使用 storyBoard
。我的主要 viewController
是通过代码从 AppDelegate
创建的。
我有:
- 在 model.swift 文件中定义的自定义 class
- 我用作容器的主要
viewController
(来自 AppDelegate
)
- 3 个额外的 viewcontroller 作为主视图的子视图(不是彼此)
- 同时显示所有 3 个子视图,每个子视图覆盖屏幕的 1/3(无 segues)
- 每个 viewcontroller 都在一个单独的 .swift 文件中
我想在主 viewController
中创建自定义 class 的实例,并让所有 3 个子视图都能够引用该实例。
每个子视图视图控制器都需要能够 get/set 实例变量,并且其他子视图需要知道这些更改。
我想我将需要使用通知来将更改传达给多个子视图 - 但我什至还没有开始尝试弄清楚这一点。
如果这个 之前被询问和回答过 - 有人可以提供 link - 或者提供正确的搜索词以便我能够找到答案?我发现的唯一接近的答案是使用 segues 来回传递数据。
您可以使用委托模式。下面的代码假设您使用的是 MVVM
模式。 (对于 VIPER
/ReSwift
模式也非常相似)
protocol DataChangedDelegate {
func refreshData()
}
// ViewModel for FirstViewController
class FirstViewModel {
var delegate: DataChangedDelegate?
var data: Any {
didSet {
delegate?.refreshData()
}
}
//rest of the things
}
//similarly other two view models will have a delegate and on data change will call the refresh method
你的视图控制器应该采用这个协议
class FirstViewController: UIViewController, DataChangedDelegate {
//view controller code
//delegate code
func refreshDate() {
//tableView.reloadDate()
//collectionView.reloadDate()
//lableView.text = viewModel.data()
}
}
无论你在哪里创建 viewControllers 并添加为 subView,你都必须设置 viewModel 的委托。
let firstViewController: FirstViewController = createFirstViewController()
let firstViewModel = FirstViewModel()
firstViewModel.delegate = firstViewController
firstViewController.viewModel = firstViewModel
mainViewController.addSubView(firstViewController.view)
对于所有其他视图控制器也是如此。
我会这样做:
- 创建单例class。
- 在主ViewController中配置单例的属性。
- 使用 didSet post 通知。
- 在额外的 ViewController 中为该通知添加一个侦听器。
我是 Swift 的新手,我确信这个问题很基础,之前已经有人问过并回答过。
我没有使用 storyBoard
。我的主要 viewController
是通过代码从 AppDelegate
创建的。
我有:
- 在 model.swift 文件中定义的自定义 class
- 我用作容器的主要
viewController
(来自AppDelegate
) - 3 个额外的 viewcontroller 作为主视图的子视图(不是彼此)
- 同时显示所有 3 个子视图,每个子视图覆盖屏幕的 1/3(无 segues)
- 每个 viewcontroller 都在一个单独的 .swift 文件中
我想在主 viewController
中创建自定义 class 的实例,并让所有 3 个子视图都能够引用该实例。
每个子视图视图控制器都需要能够 get/set 实例变量,并且其他子视图需要知道这些更改。
我想我将需要使用通知来将更改传达给多个子视图 - 但我什至还没有开始尝试弄清楚这一点。
如果这个 之前被询问和回答过 - 有人可以提供 link - 或者提供正确的搜索词以便我能够找到答案?我发现的唯一接近的答案是使用 segues 来回传递数据。
您可以使用委托模式。下面的代码假设您使用的是 MVVM
模式。 (对于 VIPER
/ReSwift
模式也非常相似)
protocol DataChangedDelegate {
func refreshData()
}
// ViewModel for FirstViewController
class FirstViewModel {
var delegate: DataChangedDelegate?
var data: Any {
didSet {
delegate?.refreshData()
}
}
//rest of the things
}
//similarly other two view models will have a delegate and on data change will call the refresh method
你的视图控制器应该采用这个协议
class FirstViewController: UIViewController, DataChangedDelegate {
//view controller code
//delegate code
func refreshDate() {
//tableView.reloadDate()
//collectionView.reloadDate()
//lableView.text = viewModel.data()
}
}
无论你在哪里创建 viewControllers 并添加为 subView,你都必须设置 viewModel 的委托。
let firstViewController: FirstViewController = createFirstViewController()
let firstViewModel = FirstViewModel()
firstViewModel.delegate = firstViewController
firstViewController.viewModel = firstViewModel
mainViewController.addSubView(firstViewController.view)
对于所有其他视图控制器也是如此。
我会这样做:
- 创建单例class。
- 在主ViewController中配置单例的属性。
- 使用 didSet post 通知。
- 在额外的 ViewController 中为该通知添加一个侦听器。