将 swift 属性 的值绑定到 viewModel 的 属性
Bind swift property's value to viewModel's property
我知道,这个问题可能很愚蠢,很抱歉。
情况:
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 ?? "")
)
首先,您使用 RAC (rac_textSignal()
) 的 ObjectiveC API 有什么原因吗?
当然,这仍然有效(尤其是如果您的应用中也有 Objective C 代码)。
但是,5.0.0 Release of Reactive Cocoa 引入了 UI-绑定到 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 { [=14=]?.item.id ?? "" }
顺便说一句,您也可以考虑将 selectedItem
移动到 viewModel。
我知道,这个问题可能很愚蠢,很抱歉。
情况:
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 ?? "")
)
首先,您使用 RAC (rac_textSignal()
) 的 ObjectiveC API 有什么原因吗?
当然,这仍然有效(尤其是如果您的应用中也有 Objective C 代码)。
但是,5.0.0 Release of Reactive Cocoa 引入了 UI-绑定到 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 { [=14=]?.item.id ?? "" }
顺便说一句,您也可以考虑将 selectedItem
移动到 viewModel。