Reactivecocoa: NSControl -rac_textSignal не работает при программной установке текста

Созданный на 27 авг. 2013  ·  8Комментарии  ·  Источник: ReactiveCocoa/ReactiveCocoa

Если я установил текст в NSTextField программно с помощью -setStringValue: или -setAttributedStringValue: , это не вызовет NSControlTextDidChangeNotification , что означает, что -rac_textSignal выиграл тоже не возьму сдачу. Это работает только тогда, когда текст редактируется при взаимодействии с пользователем.

Простое решение - использовать -rac_signalForSelector: для перехвата вызовов сеттерам (в дополнение к регистрации для NSControlTextDidChangeNotification ). Есть другие идеи?

question

Самый полезный комментарий

Я знаю, что это давно закрыто, но я нашел решение вашей проблемы @indragiek.
Допустим, у вас есть свойство NSString* name на вашей viewModel.
В вашем контроллере представления при привязке текстового поля к модели представления и наоборот сделайте следующее:
[[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 для некоторой логики проверки формы, и статус проверки не обновляется при нажатии Clear, потому что -rac_textSignal не принимает изменения. Единственный обходной путь - вручную опубликовать NSControlTextDidChangeNotification , что ужасно: trollface:

С точки зрения MVVM , правильным дизайном было бы выполнение валидации на _view model_, а не на представлении. Модель представления будет иметь двустороннюю привязку к текстовым полям. Затем кнопка Очистить может сбросить поля модели представления, и все будет: sparkles :.

MVC был бы довольно похож, только вместо этого с промежуточным контроллером представления или моделью.

Я думал об этом, но в моем конкретном случае использование привязок само по себе является проблемой. Однако это не имеет отношения к этому вопросу, поэтому я думаю, что это можно закрыть. Спасибо!

FWIW, даже если Cocoa Bindings ™ является проблемой, вы можете использовать RACChannel для создания ваших собственных двусторонних привязок, которые не зависят от него.

Я знаю, что это давно закрыто, но я нашел решение вашей проблемы @indragiek.
Допустим, у вас есть свойство NSString* name на вашей viewModel.
В вашем контроллере представления при привязке текстового поля к модели представления и наоборот сделайте следующее:
[[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 рейтинги