首页 > 解决方案 > Swift Combine (UIKit) 中的双向绑定

问题描述

我有一个UITableViewCell包含一个UISwitch. 这个单元格有自己的SwitchCellViewModel. 可以说它包含一些Bool值(启用与禁用)。并且ViewController是包含UITableViewviewModel为单元格创建并用它设置单元格的人。

我想实现:

  1. 在单元格级别:每当 viewModel 的 bool 属性值更改时更改 UISwitch 状态(当然无需重新加载 tableView)。
  2. 在 ViewController 级别:处理 UISwitch 状态更改(由用户)。

接下来是用例:单元格显示一些可以禁用或启用的选项。该操作转到后端,在我收到结果响应(在后端启用与禁用)后,我必须再次将视图的状态与更新的数据同步。

我了解如何在单元格级别订阅属性值更改,因此当我从 viewController 在 vi​​ewModel 中更改它时,它会立即更新单元格视图。但我不确定如何处理从视图控制器返回的操作UISwitch

是否可以通过 viewModel 中的单个@Publishedbool 属性来实现,或者对于这种双向情况,我必须有 2 个单独的东西。

对我来说,我必须为此单独公开一个看起来真的很愚蠢Publisher,因为我已经@Published在 viewmodel 中有一个属性,应该通知该视图控制器,所以我为什么不使用它。但如果我只使用一个,那么 ViewController 会@Published在 viewModel 中设置 var,cell 本身会处理它并调整 UI,但 ViewController 也会立即获取有关它的事件,因为它已订阅它。

标签: iosswiftmvvmuikitcombine

解决方案


@Published是一种单向数据流 - 它与 一起ObservableObject合成一个组合发布者链,当值“将改变”时发送更新(半双工或单向)。它不会发送已更改的值,而只会发送某些已更改的信号。

要将数据流返回到模型,您需要调用某些东西或从 UISwitch 激活触发该返回数据流。它可以像回调方法一样简单,以更新您保持状态的模型 - 这就是我通常开始的地方。


推荐阅读