【问题标题】:Bind swift property's value to viewModel's property将 swift 属性的值绑定到 viewModel 的属性
【发布时间】:2017-08-08 05:35:37
【问题描述】:

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

情况:

带有属性的 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()

但是我如何将itemid 属性更改绑定到viewModel 的itemVM
(我尝试过类似

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

)

【问题讨论】:

    标签: swift mvvm binding reactive-cocoa


    【解决方案1】:

    首先,您使用 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&lt;String?, NoError&gt;

    如果您的应用程序中没有任何 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&lt;String&gt;,您现在可以像这样绑定 selectedItem:

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-26
      • 1970-01-01
      • 2020-02-11
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2011-04-30
      相关资源
      最近更新 更多