将swift属性的值绑定到viewModel的属性

时间:2017-03-16 20:37:58

标签: 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>("")

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

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

但我如何将id item属性的更改绑定到viewModel的itemVM? (我试过像

这样的东西
  viewModel.itemVC <~ SignalProducer(value: selectedItem?.item.id ?? "")

1 个答案:

答案 0 :(得分:2)

首先,您是否有理由使用RAC的ObjectiveC API(rac_textSignal())?

当然,这仍然有效(特别是,如果您的应用中也有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,它会立即发送参数中给出的值,然后完成。这就是为什么你不能以这种方式观察到任何变化。

如果您想观察一段时间内的变化,我会先将selectedItem更改为MutableProperty

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>类型,您现在可以像这样绑定selectedItem:

viewModel.itemVC <~ selectedItem.map { $0?.item.id ?? "" }
不过,您可以考虑将selectedItem移动到viewModel。