Reactivecocoa: 以编程方式设置文本时,NSControl -rac_textSignal不起作用

创建于 2013-08-27  ·  8评论  ·  资料来源: ReactiveCocoa/ReactiveCocoa

如果我通过-setStringValue:-setAttributedStringValue: NSTextField编程方式在NSControlTextDidChangeNotification ,这意味着赢得了-rac_textSignal也不去找零钱。 它仅在通过用户交互来编辑文本时才有效。

简便的解决方法是使用-rac_signalForSelector:来拦截对setter的调用(除了注册NSControlTextDidChangeNotification )。 还有其他想法吗?

question

最有用的评论

我知道这已经关闭很长时间了,但是我为您的问题@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"/> }];`

这样,无论何时触发文本信号,您都可以进行检测,并对文本属性进行程序性更改。

所有8条评论

与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非常感谢!

此页面是否有帮助?
0 / 5 - 0 等级