Reactivecocoa: NSControl -rac_textSignal no funciona cuando se configura texto mediante programación

Creado en 27 ago. 2013  ·  8Comentarios  ·  Fuente: ReactiveCocoa/ReactiveCocoa

Si configuro texto en un NSTextField programáticamente a través de -setStringValue: o -setAttributedStringValue: , esto no activa NSControlTextDidChangeNotification , lo que significa que -rac_textSignal ganó Tampoco recogeré el cambio. Solo funciona cuando el texto se está editando mediante la interacción del usuario.

Una solución fácil sería usar -rac_signalForSelector: para interceptar llamadas a los emisores también (además de registrarse por NSControlTextDidChangeNotification ). ¿Alguna otra idea?

question

Comentario más útil

Sé que esto ha estado cerrado durante mucho tiempo, pero encontré una solución para su problema @indragiek.
Digamos que tiene una propiedad, NSString* name en su viewModel.
En su controlador de vista, cuando vincule el campo de texto al modelo de vista y viceversa, haga esto:
[[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"/> }];`

De esta manera, detecta cada vez que se activa la señal de texto Y los cambios programáticos en la propiedad del texto.

Todos 8 comentarios

La coherencia con AppKit aquí es una característica, no un error. Sería extraño, en mi opinión, que rac_textSignal dispararan por eventos que no son observables convencionalmente.

Esto no siempre tiene sentido, pero generalmente los eventos que se propagan a la capa de vista deben considerarse "finales". Si necesita filtrarlos o transformarlos antes de ese punto, debe hacerlo a través de un modelo de vista o algo por el estilo.

¿Cuál es el caso de uso para observar cambios programáticos?

Ejemplo específico: tengo un formulario con varios campos de texto y un botón Borrar, al hacer clic en Borrar establece stringValue en cada campo de texto en @"" . Utilizo rac_textSignal para alguna lógica de validación de formularios, y el estado de validación no se actualiza cuando se hace clic en Borrar porque -rac_textSignal no recoge los cambios. La única solución es publicar manualmente NSControlTextDidChangeNotification , lo cual es algo horrible de hacer: trollface:

En términos de MVVM , el diseño correcto sería realizar la validación en el _modelo de vista_, no en la vista. El modelo de vista tendría enlaces bidireccionales a los campos de texto. Luego, el botón Borrar puede restablecer los campos del modelo de vista, y todo es: destellos :

MVC sería bastante similar, solo con un controlador o modelo de vista intermediario en su lugar.

Lo había considerado, pero el uso de enlaces es un problema en sí mismo en mi caso particular. Sin embargo, eso es irrelevante para esta pregunta, así que creo que esto se puede cerrar. ¡Gracias!

FWIW, incluso si Cocoa Bindings ™ es un problema, puede usar RACChannel para construir sus propias encuadernaciones bidireccionales que no dependan de él.

Sé que esto ha estado cerrado durante mucho tiempo, pero encontré una solución para su problema @indragiek.
Digamos que tiene una propiedad, NSString* name en su viewModel.
En su controlador de vista, cuando vincule el campo de texto al modelo de vista y viceversa, haga esto:
[[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"/> }];`

De esta manera, detecta cada vez que se activa la señal de texto Y los cambios programáticos en la propiedad del texto.

@startupthekid gracias, me ayuda.

@startupthekid ¡muchas gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones