我尝试在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"
我在这里发现,要使类不是从NSObject
继承,我应该使它成为dynamic
,但我不能使Enum
动态。有没有办法让Enum
变得可观察?
4条答案
按热度按时间kmynzznz1#
您不需要使用KVO来执行此任务。就像这样使用BehaviorSubject:
创建一个私有字段,如下所示:
然后你有一个像这样的属性,它通知BehaviorSubject值确实改变了。
要订阅任何更改,请使用与此语句等效的语句:
a6b3iqyw2#
因为你的枚举类型是
Int
,你可以通过将它标记为@objc
来使它与objective-c兼容。这样做将使编译器可以将属性标记为dynamic
。为了使属性符合KVO,还需要使用@objc
进行标注。lymnna713#
我可以建议只做一个代理变量,并在上面使用KVO。
更多详情-https://christiantietze.de/posts/2015/05/observing-enum-swift-kvo/
k4emjkb14#
如果应用程序支持的最低iOS版本为13.0或更高版本,则可以使用合并并将属性设置为
@Published
这样观察它: