Как связать NSString с UITextView в Reactive Cocoa?

Я создаю социальный клиент iOS, и в представлении «составить» у меня есть UITextView, где пользователь вводит текст. Я хотел бы использовать ReactiveCocoa для привязки text из UITextView к NSString модели данных, чтобы следовать MVVM.

Однако я столкнулся с несколькими проблемами, все из которых связаны с одной вещью: блок RACObserve не вызывается, когда текст UITextView изменяется программно.

(Пример: я изменяю текст в строку с атрибутами, чтобы выделить #хэштеги, @usernames и т. д., но эта строка с атрибутами не создается при программном изменении представления.)

В моем предыдущем вопросе по этой теме Я получил полезный совет, что я должен привязать текстовое представление к модели - и наоборот - но мне не ясно, как мне это сделать с текущей версией Reactive Cocoa. пример кода, который мне удалось найти вызывает API, которые сейчас устарели.

Как правильно связать rac_textSignal UITextView с NSString (и наоборот), чтобы я мог надежно вызывать блок кода при изменении содержимого UITextView (будь то программно или пользователем)?


person bryanjclark    schedule 26.02.2014    source источник


Ответы (1)


Ответ зависит от того, должна ли привязка между text модели представления и UITextViews text быть двунаправленной. Обычно мы пытаемся держаться подальше от двунаправленных привязок, потому что о них становится труднее рассуждать. В идеале только одно направление управляет данными.

Итак, в этом случае вы должны написать что-то вроде:

RAC(self.viewModel, text) = [RACSignal merge:@[ 
                                [self.textView rac_textSignal], 
                                RACObserve(self.textView, text),
                            ]];

Таким образом, вы улавливаете изменения как свойства UITextViews text напрямую, так и текстовые изменения, которые исходят от ввода пользователем.

person joshaber    schedule 26.02.2014
comment
Затем оттуда вы можете RACObserve(self.viewModel, text) узнать обо всех изменениях текста. - person joshaber; 26.02.2014
comment
Идеальный! Большое спасибо. - person bryanjclark; 26.02.2014