UITextView+RACSignalSupport.m 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. //
  2. // UITextView+RACSignalSupport.m
  3. // ReactiveObjC
  4. //
  5. // Created by Cody Krieger on 5/18/12.
  6. // Copyright (c) 2012 Cody Krieger. All rights reserved.
  7. //
  8. #import "UITextView+RACSignalSupport.h"
  9. #import <ReactiveObjC/RACEXTScope.h>
  10. #import "NSObject+RACDeallocating.h"
  11. #import "NSObject+RACDescription.h"
  12. #import "RACDelegateProxy.h"
  13. #import "RACSignal+Operations.h"
  14. #import "RACTuple.h"
  15. #import <objc/runtime.h>
  16. @implementation UITextView (RACSignalSupport)
  17. static void RACUseDelegateProxy(UITextView *self) {
  18. if (self.delegate == self.rac_delegateProxy) return;
  19. self.rac_delegateProxy.rac_proxiedDelegate = self.delegate;
  20. self.delegate = (id)self.rac_delegateProxy;
  21. }
  22. - (RACDelegateProxy *)rac_delegateProxy {
  23. RACDelegateProxy *proxy = objc_getAssociatedObject(self, _cmd);
  24. if (proxy == nil) {
  25. proxy = [[RACDelegateProxy alloc] initWithProtocol:@protocol(UITextViewDelegate)];
  26. objc_setAssociatedObject(self, _cmd, proxy, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  27. }
  28. return proxy;
  29. }
  30. - (RACSignal *)rac_textSignal {
  31. @weakify(self);
  32. RACSignal *signal = [[[[[RACSignal
  33. defer:^{
  34. @strongify(self);
  35. return [RACSignal return:RACTuplePack(self)];
  36. }]
  37. concat:[self.rac_delegateProxy signalForSelector:@selector(textViewDidChange:)]]
  38. reduceEach:^(UITextView *x) {
  39. return x.text;
  40. }]
  41. takeUntil:self.rac_willDeallocSignal]
  42. setNameWithFormat:@"%@ -rac_textSignal", RACDescription(self)];
  43. RACUseDelegateProxy(self);
  44. return signal;
  45. }
  46. @end