| // |
| // UITextView+RACSignalSupport.m |
| // ReactiveCocoa |
| // |
| // Created by Cody Krieger on 5/18/12. |
| // Copyright (c) 2012 Cody Krieger. All rights reserved. |
| // |
| |
| #import "UITextView+RACSignalSupport.h" |
| #import "RACEXTScope.h" |
| #import "NSObject+RACDeallocating.h" |
| #import "RACDelegateProxy.h" |
| #import "RACSignal+Operations.h" |
| #import "RACTuple.h" |
| #import "NSObject+RACDescription.h" |
| #import <objc/runtime.h> |
| |
| @implementation UITextView (RACSignalSupport) |
| |
| static void RACUseDelegateProxy(UITextView *self) { |
| if (self.delegate == self.rac_delegateProxy) return; |
| |
| self.rac_delegateProxy.rac_proxiedDelegate = self.delegate; |
| self.delegate = (id)self.rac_delegateProxy; |
| } |
| |
| - (RACDelegateProxy *)rac_delegateProxy { |
| RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd); |
| if (proxy == nil) { |
| proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UITextViewDelegate)]; |
| objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC); |
| } |
| |
| return proxy; |
| } |
| |
| - (RACSignal *)rac_textSignal { |
| @weakify(self); |
| RACSignal *signal = [[[[[RACSignal |
| defer:^{ |
| @strongify(self); |
| return [RACSignal return:RACTuplePack(self)]; |
| }] |
| concat:[self.rac_delegateProxy signalForSelector:@selector(textViewDidChange:)]] |
| reduceEach:^(UITextView *x) { |
| return x.text; |
| }] |
| takeUntil:self.rac_willDeallocSignal] |
| setNameWithFormat:@"%@ -rac_textSignal", [self rac_description]]; |
| |
| RACUseDelegateProxy(self); |
| |
| return signal; |
| } |
| |
| @end |