Swift2 如何使用Swift实现双向绑定?
如何使用Swift 2.0实现双向数据绑定 假设我有以下模型类(使用couchbase lite): 我喜欢将属性绑定到给定的formItemDescriptor,如下所示:Swift2 如何使用Swift实现双向绑定?,swift2,couchbase-lite,Swift2,Couchbase Lite,如何使用Swift 2.0实现双向数据绑定 假设我有以下模型类(使用couchbase lite): 我喜欢将属性绑定到给定的formItemDescriptor,如下所示: class FormItemDescriptor { var tag: String? var value: Any? } let person: Person let nameLabel: UILabel person.rValueForKeyPath("firstName").bindTo(name
class FormItemDescriptor {
var tag: String?
var value: Any?
}
let person: Person
let nameLabel: UILabel
person.rValueForKeyPath("firstName").bindTo(nameLabel)
如何使用双向绑定将formitemscriptor.value
属性绑定到Person.firstName
属性
因此,模型中的更改以表单的形式出现,反之亦然?Swift不支持开箱即用的绑定,但您可以使用类似的框架来实现它们 例如,当您声明一个可观察属性时,您可以将其绑定到另一个可观察属性
let numberA: Property<Int>
let numberB: Property<Int>
numberA.bindTo(numberB)
现在,只要你改变其中一个,另一个就会改变
不过,您的示例有点难,因为您需要从@NSManaged属性进行绑定,而这些属性不能被观察到。这不是不可能的,但是要工作,Person的属性应该支持键值观察(KVO)
例如,给定一个Person对象和一个标签,您可以使用方法rValueForKeyPath
从启用KVO的属性中获取一个属性,然后将该可观察对象绑定到标签,如下所示:
class FormItemDescriptor {
var tag: String?
var value: Any?
}
let person: Person
let nameLabel: UILabel
person.rValueForKeyPath("firstName").bindTo(nameLabel)
如果您有一个中间对象,如FormItemDescriptor
,则必须使其属性可见
class FormItemDescriptor {
var tag: Property<String?>
var value: Property<Any?>
}
因为firstName
是不可见的,所以不能在另一个方向进行绑定,所以每当value
发生变化时,必须手动更新它
descriptor.value.observeNext { value in
person.firstName = value as? NSString
}
我们还必须对NSString
进行强制转换,因为value
属于Any?
类型。不过,你应该重新考虑一下,看看能不能让它成为一种更强的类型
请注意,UIKit绑定来自ReactiveUIKit框架。有关更多信息,请查看我们的文档。非常感谢您的详细解释!我曾考虑过两种绑定方式-a.bindTo(b),b.bindTo(a)
,但害怕无休止的循环或任何其他奇怪的行为。因此,使用ReactiveKit进行这种双向绑定真的很省钱吗?是的,它是完全安全的-有一种内部机制,使得无休止的循环成为不可能。
descriptor.value.observeNext { value in
person.firstName = value as? NSString
}