swift - 将 swift 属性的值绑定(bind)到 viewModel 的属性

标签 swift mvvm binding reactive-cocoa

我知道,这个问题可能很愚蠢,很抱歉。

情况:

具有属性的 UIViewController
var selectedItem: (item: ItemEntity, index: Int)?

struct ItemEntity {
    let id: String
    let name: String
}

和带有属性的viewModel
var itemVM = MutableProperty<String>("")

问题:
如果我想绑定(bind) textField.text 值更改我只使用

viewModel.name <~ nameField.rac_textSignal().toSignalProducer()

但我如何绑定(bind) id 的更改item的属性(property)查看模特的 itemVM ?
(我试过类似

  viewModel.itemVC <~ SignalProducer(value: selectedItem?.item.id ?? "")

)

最佳答案

首先,您使用 RAC (rac_textSignal()) 的 ObjectiveC API 有什么原因吗?

当然,这仍然有效(特别是如果您的应用程序中也有 Objective C 代码)。

然而,5.0.0 Release of Reactive Cocoa已将 UI-Bindings 引入 Swift API,它允许您从

viewModel.name <~ nameField.rac_textSignal().toSignalProducer()

viewModel.name <~ nameField.reactive.continuousTextValues

现在正确输入为 Signal<String?, NoError>

如果您的应用程序中没有任何 ObjC 代码,则无需再使用 5.0.0 导入 Reactive Cocoa 的整个 ObjC API

针对您的实际问题:

你用 SignalProducer(value: selectedItem?.item.id ?? "") 做了什么是创建一个 SignalProducer ,即立即发送参数中给定的值,然后完成。这就是为什么您无法通过这种方式观察到任何变化。

如果你想观察随时间的变化,我会先改变selectedItemMutableProperty :

typealias SelectedItem = (item: ItemEntity, index: Int)
let selectedItem = MutableProperty<SelectedItem?>(nil)

现在,您可以设置 selectedItem像这样:

let item1 = ItemEntity(id: "1", name: "One")
selectedItem.value = (item: item1, index: 0)

假设,viewModel.itemVC类型为 MutableProperty<String> ,您现在可以像这样绑定(bind) selectedItem:

viewModel.itemVC <~ selectedItem.map { $0?.item.id ?? "" }

顺便说一句,你可以考虑移动 selectedItem也到 viewModel。

关于swift - 将 swift 属性的值绑定(bind)到 viewModel 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42844339/

相关文章:

SwiftUI:如何迭代可绑定(bind)对象的数组?

silverlight-4.0 - 展开项目与选定项目不同

wpf - WPF(MVVM)菜单中的互斥(和可绑定(bind))复选框

c# - WPF 绑定(bind)到 contentcontrol.child 调用了两次

swift - 尝试在 swift 3 中应用圆形覆盖时出错

c# - 了解枚举和 ViewModel

wpf - F# 异步和 WPF 进度条

arrays - Swift:将文本字段保存在数组中

ios - UIStackView 在 Interface Builder 中的显示有所不同

ios - 如何创建和使用 iOS 框架与扩展共享代码