UITextField+BlocksKit.m 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. //
  2. // UITextField+BlocksKit.m
  3. // BlocksKit
  4. //
  5. #import "UITextField+BlocksKit.h"
  6. #import "A2DynamicDelegate.h"
  7. #import "NSObject+A2BlockDelegate.h"
  8. #pragma mark Delegate
  9. @interface A2DynamicUITextFieldDelegate : A2DynamicDelegate
  10. @end
  11. @implementation A2DynamicUITextFieldDelegate
  12. - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
  13. {
  14. BOOL ret = YES;
  15. id realDelegate = self.realDelegate;
  16. if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldBeginEditing:)])
  17. ret = [realDelegate textFieldShouldBeginEditing:textField];
  18. BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
  19. if (block)
  20. ret &= block(textField);
  21. return ret;
  22. }
  23. - (void)textFieldDidBeginEditing:(UITextField *)textField
  24. {
  25. id realDelegate = self.realDelegate;
  26. if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldDidBeginEditing:)])
  27. [realDelegate textFieldDidBeginEditing:textField];
  28. void (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
  29. if (block)
  30. block(textField);
  31. }
  32. - (BOOL)textFieldShouldEndEditing:(UITextField *)textField
  33. {
  34. BOOL ret = YES;
  35. id realDelegate = self.realDelegate;
  36. if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldEndEditing:)])
  37. ret = [realDelegate textFieldShouldEndEditing:textField];
  38. BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
  39. if (block)
  40. ret &= block(textField);
  41. return ret;
  42. }
  43. - (void)textFieldDidEndEditing:(UITextField *)textField
  44. {
  45. id realDelegate = self.realDelegate;
  46. if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldDidEndEditing:)])
  47. [realDelegate textFieldDidEndEditing:textField];
  48. void (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
  49. if (block)
  50. block(textField);
  51. }
  52. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
  53. {
  54. BOOL ret = YES;
  55. id realDelegate = self.realDelegate;
  56. if (realDelegate && [realDelegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)])
  57. ret = [realDelegate textField:textField shouldChangeCharactersInRange:range replacementString:string];
  58. BOOL (^block)(UITextField *, NSRange, NSString *) = [self blockImplementationForMethod:_cmd];
  59. if (block)
  60. ret &= block(textField, range, string);
  61. return ret;
  62. }
  63. - (BOOL)textFieldShouldClear:(UITextField *)textField
  64. {
  65. BOOL ret = YES;
  66. id realDelegate = self.realDelegate;
  67. if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldClear:)])
  68. ret = [realDelegate textFieldShouldClear:textField];
  69. BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
  70. if (block)
  71. ret &= block(textField);
  72. return ret;
  73. }
  74. - (BOOL)textFieldShouldReturn:(UITextField *)textField
  75. {
  76. BOOL ret = YES;
  77. id realDelegate = self.realDelegate;
  78. if (realDelegate && [realDelegate respondsToSelector:@selector(textFieldShouldReturn:)])
  79. ret = [realDelegate textFieldShouldReturn:textField];
  80. BOOL (^block)(UITextField *) = [self blockImplementationForMethod:_cmd];
  81. if (block)
  82. ret &= block(textField);
  83. return ret;
  84. }
  85. @end
  86. #pragma mark - Category
  87. @implementation UITextField (BlocksKit)
  88. @dynamic bk_shouldBeginEditingBlock, bk_didBeginEditingBlock, bk_shouldEndEditingBlock, bk_didEndEditingBlock, bk_shouldChangeCharactersInRangeWithReplacementStringBlock, bk_shouldClearBlock, bk_shouldReturnBlock;
  89. + (void)load {
  90. [self bk_registerDynamicDelegate];
  91. [self bk_linkDelegateMethods: @{
  92. @"bk_shouldBeginEditingBlock": @"textFieldShouldBeginEditing:",
  93. @"bk_didBeginEditingBlock": @"textFieldDidBeginEditing:",
  94. @"bk_shouldEndEditingBlock": @"textFieldShouldEndEditing:",
  95. @"bk_didEndEditingBlock" : @"textFieldDidEndEditing:",
  96. @"bk_shouldChangeCharactersInRangeWithReplacementStringBlock" : @"textField:shouldChangeCharactersInRange:replacementString:",
  97. @"bk_shouldClearBlock" : @"textFieldShouldClear:",
  98. @"bk_shouldReturnBlock" : @"textFieldShouldReturn:",
  99. }];
  100. }
  101. @end