如果我通过-setStringValue:
或-setAttributedStringValue:
NSTextField
编程方式在NSControlTextDidChangeNotification
,这意味着赢得了-rac_textSignal
也不去找零钱。 它仅在通过用户交互来编辑文本时才有效。
简便的解决方法是使用-rac_signalForSelector:
来拦截对setter的调用(除了注册NSControlTextDidChangeNotification
)。 还有其他想法吗?
与AppKit的一致性是一个功能,而不是错误。 IMO为rac_textSignal
触发传统上无法观察到的事件会很奇怪。
这并不总是有意义,但通常,传播到视图层的事件应视为“最终”。 如果您需要在此之前对它们进行过滤或转换,则应通过视图模型或类似的方法来完成。
观察程序更改的用例是什么?
具体示例:我有一个包含多个文本字段和“清除”按钮的表单,单击“清除”将每个文本字段上的stringValue
设置为@""
。 我将rac_textSignal
用于某些表单验证逻辑,并且单击-rac_textSignal
Clear时不会更新验证状态,因为NSControlTextDidChangeNotification
,这是一件可怕的事情:trollface:
就MVVM而言,正确的设计是对_view model_而非视图执行验证。 视图模型将对文本字段进行双向绑定。 然后,“清除”按钮可以重置视图模型的字段,并且所有内容都是: sparkles:。
MVC会非常相似,只是使用中间视图控制器或模型。
我曾经考虑过,但是在我的特定情况下,使用绑定本身是一个问题。 但是,这与这个问题无关,所以我认为可以解决这个问题。 谢谢!
FWIW,即使Cocoa Bindings™有问题,您也可以使用RACChannel
来构建自己的不依赖它的双向绑定。
我知道这已经关闭很长时间了,但是我为您的问题@indragiek找到了解决方案。
假设您在viewModel上有一个属性NSString* name
。
在视图控制器中,将文本字段绑定到视图模型时,反之亦然:
[[RACSignal merge:@[self.nameField.rac_textSignal, RACObserve(self.nameField, text)]]<br i="9"/>
subscribeNext:^(NSString* text){<br i="10"/>
self.viewModel.name = text;<br i="11"/>
}];`
这样,无论何时触发文本信号,您都可以进行检测,并对文本属性进行程序性更改。
@startupthekid谢谢,对我有帮助。
@startupthekid非常感谢!
最有用的评论
我知道这已经关闭很长时间了,但是我为您的问题@indragiek找到了解决方案。
假设您在viewModel上有一个属性
NSString* name
。在视图控制器中,将文本字段绑定到视图模型时,反之亦然:
[[RACSignal merge:@[self.nameField.rac_textSignal, RACObserve(self.nameField, text)]]<br i="9"/> subscribeNext:^(NSString* text){<br i="10"/> self.viewModel.name = text;<br i="11"/> }];`
这样,无论何时触发文本信号,您都可以进行检测,并对文本属性进行程序性更改。