我试图在MVVM中使用RxSwift进行绑定。
我有Enum
:
enum Color : Int {
case Red = 0, Green
}
和测试类
class Test : NSObject {
var color: Color = .Red
dynamic var test: String? {
didSet {
print("didSet \(test)")
}
}
}
并希望观察如下变化:
test.rx_observe(Color.self, "color").subscribeNext { (color) -> Void in
print("Observer \(color)")
}.addDisposableTo(bag)
但该程序与之相冲突
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<RDProject.Test 0x7ff373513020> addObserver:<RxCocoa.KVOObserver 0x7ff37351a420> forKeyPath:@"color" options:5 context:0x0] was sent to an object that is not KVC-compliant for the "color" property.'
简单String
的代码有效:
test.rx_observe(String.self, "test").subscribeNext { string in
print("Observer \(string)")
}.addDisposableTo(bag)
test.test = "1"
test.test = "2"
我发现here要使类继承而不是NSObject
我应该将其设为dynamic
,但我无法使Enum
动态化。
有没有办法使Enum
可观察到?
答案 0 :(得分:3)
您不需要使用KVO执行此任务。 只需使用这样的BehaviorSubject:
像这样创建一个私有字段:
let colorSubject = BehaviorSubject<Color?>(value: nil)
然后你有一个像这样的属性,通知BehaviorSubject值确实发生了变化。
var color : Color? {
didSet {
colorSubject.onNext(color)
}
}
要订阅任何更改,请使用与此相同的语句:
let disposable = colorSubject.subscribeNext { (color: Color?) -> Void in
// Do something with it.
}
答案 1 :(得分:1)
因为您的枚举类型为Int
,所以您可以通过使用@objc
标记它来使其与objective-c兼容。这样做会使编译器正常,将属性标记为dynamic
。
@objc enum Color : Int {
case Red = 0, Green
}
class Test : NSObject {
dynamic var color: Color = .Red
dynamic var test: String? {
didSet {
print("didSet \(test)")
}
}
}
答案 2 :(得分:0)
我建议只制作代理变量并在其上使用KVO。
class Model: NSObject {
enum Color: Int {
case Red = 0, Green
}
dynamic var colorRaw: Int?
var color: Color = .Red {
didSet {
colorRaw = color.rawValue
}
}
}
此处有更多详情 - https://christiantietze.de/posts/2015/05/observing-enum-swift-kvo/