ios - Swift Combine (UIKit) 中的双向绑定
问题描述
我有一个UITableViewCell
包含一个UISwitch
. 这个单元格有自己的SwitchCellViewModel
. 可以说它包含一些Bool
值(启用与禁用)。并且ViewController
是包含UITableView
,viewModel
为单元格创建并用它设置单元格的人。
我想实现:
- 在单元格级别:每当 viewModel 的 bool 属性值更改时更改 UISwitch 状态(当然无需重新加载 tableView)。
- 在 ViewController 级别:处理 UISwitch 状态更改(由用户)。
接下来是用例:单元格显示一些可以禁用或启用的选项。该操作转到后端,在我收到结果响应(在后端启用与禁用)后,我必须再次将视图的状态与更新的数据同步。
我了解如何在单元格级别订阅属性值更改,因此当我从 viewController 在 viewModel 中更改它时,它会立即更新单元格视图。但我不确定如何处理从视图控制器返回的操作UISwitch
。
是否可以通过 viewModel 中的单个@Published
bool 属性来实现,或者对于这种双向情况,我必须有 2 个单独的东西。
对我来说,我必须为此单独公开一个看起来真的很愚蠢Publisher
,因为我已经@Published
在 viewmodel 中有一个属性,应该通知该视图控制器,所以我为什么不使用它。但如果我只使用一个,那么 ViewController 会@Published
在 viewModel 中设置 var,cell 本身会处理它并调整 UI,但 ViewController 也会立即获取有关它的事件,因为它已订阅它。
解决方案
@Published
是一种单向数据流 - 它与 一起ObservableObject
合成一个组合发布者链,当值“将改变”时发送更新(半双工或单向)。它不会发送已更改的值,而只会发送某些已更改的信号。
要将数据流返回到模型,您需要调用某些东西或从 UISwitch 激活触发该返回数据流。它可以像回调方法一样简单,以更新您保持状态的模型 - 这就是我通常开始的地方。
推荐阅读
- azure-storage - 看不到 ADLS Gen2 的“生命周期管理”选项
- java - gradle 插件使用代码中使用的较旧/不同版本的 java 库
- angular - 单击 ionic 4 移动应用程序中的按钮后,如何更改侧边菜单的内容?
- javascript - 是否有维护插件与“offline.js”做同样的事情?
- lua - lua中的多部分帖子
- android - 无法在 android studio 中构建 React-Native 项目
- javascript - Angular - 在一个模块中路由两个模块
- git - 应该提交 .podspec 文件吗?
- android - 使用播放控制台进行内部测试,我如何取消发布应用程序
- wordpress-theming - 子主题:修改文件