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

现在,我尝试使用最新版本的 ReactiveCocoa 快速实现相同的目标,怎么办?

4

1 回答 1

4

ReactiveCocoa 5.0 将添加 UIKit Extensions

button.reactive.values(forKeyPath:)

这在一个简单的操场上对我有用:

button.reactive.values(forKeyPath: "enabled")
    .map { $0 as? Bool }
    .skipNil()
    .map { enabled in enabled ? UIColor.blue : UIColor.red }
    .startWithValues { [weak button = button] color in
        button?.setTitleColor(color, for: .normal)
    }

但是,不鼓励这样做,因为

  1. UIKit 不符合 KVO,如果它可以工作,那只是巧合。
  2. 可以说,您的“真相”不应该在 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

于 2016-11-25T12:12:52.510 回答