2013-11-25 5 views
7

Я реализую пользовательский интерфейс чата и используя Reactive Cocoa для настройки размера чата в качестве пользовательских типов. В настоящее время я обновляю макет пользовательского интерфейса на основе текстового поля rac_textSignal. Все работает прекрасно - за исключением одного бита: когда пользователь отправляет сообщение, программно очистить текстовое поле:Reactive Cocoa - rac_textSignal UITextView не вызывается при программном настройке текста

_inputTextView.text = @""; 

... но TextView-х rac_textSignal не активируется. I hear this is a feature with ReactiveCocoa - но какой способ построить это? Нужно ли иметь NSString, содержащую currentlyTypedString, и управлять изменениями пользовательского интерфейса при обновлении этой строки?

+1

Я знаю, что этот вопрос старый, но если вы просто используете 'RACSignal.combineLatest ([self.textView.rac_textSignal(), RACObserve (self.textView," text ")]' yadda yadda yadda. Таким образом, вы подписываетесь как для пользовательского интерфейса, так и для программных обновлений – barndog

ответ

7

Да, это правильно.

Под MVVM, модель вида следует считать канонический источник данных интерфейса и событий (что приводит к целому ряду важных преимуществ, как лучше контролируемость). Вы сохранили напечатанную модель NSString на модели представления, затем привяжите к к пользовательскому интерфейсу.

С MVC вам придется использовать контроллер или модель вместо этого, но принцип тот же: обрабатывать представление как временные данные и делать важные вещи в другом месте.

9

Просто отправьте действие:

[self.inputTextView sendActionsForControlEvents: UIControlEventEditingChanged];

0

Ниже обходной путь, который работает:

[[RACSignal 
    merge:@[self.inputTextView.rac_textSignal, RACObserve(self.inputTextView, text)]] 
    subscribeNext:^(NSString* text) { 
     // do something here 
    }]; 

Thanks to startupthekid на GitHub.

Смежные вопросы