ReactiveCocoa 5.0 中的 RACObserve(object, keyPath)
RACObserve(object, keyPath) in ReactiveCocoa 5.0
我要监控 UIButton.enabled 属性 改变 button.titleColor
我在OC中做过这样的:
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface ViewController () <UITextViewDelegate>
@property (weak, nonatomic) IBOutlet UIButton *btn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initUI];
}
- (void)initUI {
__weak typeof(self) weakSelf = self;
[[RACObserve(self.btn, enabled) map:^id(id value) {
return [value boolValue] ? [UIColor greenColor] : [UIColor redColor];
}] subscribeNext:^(id x) {
[weakSelf.btn setTitleColor:x forState:UIControlStateNormal];
}];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.btn.enabled = !self.btn.enabled;
}
@end
现在,我尝试在 swift 使用最新版本的 ReactiveCocoa 来实现相同的目标,怎么办?
ReactiveCocoa 5.0 will add UIKit Extensions.
与button.reactive.values(forKeyPath:)
这在简单的 Playground 中对我有用:
button.reactive.values(forKeyPath: "enabled")
.map { [=10=] as? Bool }
.skipNil()
.map { enabled in enabled ? UIColor.blue : UIColor.red }
.startWithValues { [weak button = button] color in
button?.setTitleColor(color, for: .normal)
}
但是,不鼓励这样做,因为
- UIKit does not comply to KVO 如果它起作用了,纯属巧合。
- 可以说,您的 "truth" 不应该在 UI / 按钮中,但您应该在某处有一个模型来确定按钮是否启用。
有模特
在这个例子中,一个简单的 MutableProperty
被用作模型,它可以在 ViewModel 或任何地方
let buttonEnabled = MutableProperty<Bool>(false)
button.reactive.isEnabled <~ buttonEnabled
buttonEnabled.producer
.map { enabled in enabled ? UIColor.blue : UIColor.red }
.startWithValues { [weak button = button] color in
button?.setTitleColor(color, for: .normal)
}
不幸的是,您不能像使用 isEnabled
那样直接绑定到按钮标题颜色
我要监控 UIButton.enabled 属性 改变 button.titleColor
我在OC中做过这样的:
#import "ViewController.h"
#import <ReactiveCocoa/ReactiveCocoa.h>
@interface ViewController () <UITextViewDelegate>
@property (weak, nonatomic) IBOutlet UIButton *btn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initUI];
}
- (void)initUI {
__weak typeof(self) weakSelf = self;
[[RACObserve(self.btn, enabled) map:^id(id value) {
return [value boolValue] ? [UIColor greenColor] : [UIColor redColor];
}] subscribeNext:^(id x) {
[weakSelf.btn setTitleColor:x forState:UIControlStateNormal];
}];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
self.btn.enabled = !self.btn.enabled;
}
@end
现在,我尝试在 swift 使用最新版本的 ReactiveCocoa 来实现相同的目标,怎么办?
ReactiveCocoa 5.0 will add UIKit Extensions.
与button.reactive.values(forKeyPath:)
这在简单的 Playground 中对我有用:
button.reactive.values(forKeyPath: "enabled")
.map { [=10=] as? Bool }
.skipNil()
.map { enabled in enabled ? UIColor.blue : UIColor.red }
.startWithValues { [weak button = button] color in
button?.setTitleColor(color, for: .normal)
}
但是,不鼓励这样做,因为
- UIKit does not comply to KVO 如果它起作用了,纯属巧合。
- 可以说,您的 "truth" 不应该在 UI / 按钮中,但您应该在某处有一个模型来确定按钮是否启用。
有模特
在这个例子中,一个简单的 MutableProperty
被用作模型,它可以在 ViewModel 或任何地方
let buttonEnabled = MutableProperty<Bool>(false)
button.reactive.isEnabled <~ buttonEnabled
buttonEnabled.producer
.map { enabled in enabled ? UIColor.blue : UIColor.red }
.startWithValues { [weak button = button] color in
button?.setTitleColor(color, for: .normal)
}
不幸的是,您不能像使用 isEnabled