如何在 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 创建的。

我有:

我想在主 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)

对于所有其他视图控制器也是如此。

我会这样做:

  1. 创建单例class。
  2. 在主ViewController中配置单例的属性。
  3. 使用 didSet post 通知。
  4. 在额外的 ViewController 中为该通知添加一个侦听器。