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

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

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

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

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

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

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

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

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

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