3

我想影响多个属性,并且在UIButton.

我正在尝试推理最好的方法,但可以使用一些输入。

这是我所拥有的:

// Listen for changes on the textfields, alter the button UI state
[[RACSignal
  combineLatest:@[ _usernameField.rac_textSignal,_passwordField.rac_textSignal]
  reduce:^id(NSString *username, NSString *password) {
      BOOL valid = [username length] >= 4 && [password length] >= 4;
      _loginButton.enabled = valid;
      _loginButton.alpha = valid ?: 0.65;
      return nil;
  }] subscribeCompleted:^{}];

// Listen for taps
_loginButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    NSLog(@"Tap");
    return [RACSignal empty];
}];

这行得通,但我很想听听任何建议。

4

2 回答 2

6

与其考虑如何一次更新多个属性,不如将每个属性视为随时间变化的值可能会有所帮助。

因此,您可以使用自己的信号(值流)对每个属性进行建模,重用公共“基本”流以避免重复重要逻辑:

RACSignal *valid = [RACSignal
    combineLatest:@[ _usernameField.rac_textSignal, _passwordField.rac_textSignal ]
    reduce:^(NSString *username, NSString *password) {
        return @([username length] >= 4 && [password length] >= 4);
    }];

RAC(_loginButton, enabled) = valid;
RAC(_loginButton, alpha) = [valid map:^(NSNumber *b) {
    return @(b.boolValue ? 1 : 0.65);
}];

这也有避免任何副作用的好处。

于 2013-11-08T07:58:20.710 回答
0

JFI 我使用多个赋值将多个属性绑定到一个信号。像这样。在我的脑海里读起来很漂亮。

RAC(self.channelLabel, textColor) = 
RAC(self.roomNameTextField, textColor) = [RACObserve(self, roomImage) map:^id(id value) {
    return value ? [UIColor whiteColor] : [UIColor blackColor];
}];
于 2014-12-19T19:43:28.303 回答