/BlocksKit/UIControl+BlocksKit.m

http://github.com/zwaldowski/BlocksKit · Objective C · 111 lines · 78 code · 29 blank · 4 comment · 7 complexity · 82417fa32f3d92f94a232ae01bf5fac9 MD5 · raw file

  1. //
  2. // UIControl+BlocksKit.m
  3. // BlocksKit
  4. //
  5. #import "UIControl+BlocksKit.h"
  6. #import "NSObject+AssociatedObjects.h"
  7. #import "NSSet+BlocksKit.h"
  8. static char kControlHandlersKey;
  9. #pragma mark Private
  10. @interface BKControlWrapper : NSObject <NSCopying>
  11. - (id)initWithHandler:(BKSenderBlock)aHandler forControlEvents:(UIControlEvents)someControlEvents;
  12. @property (nonatomic, copy) BKSenderBlock handler;
  13. @property (nonatomic) UIControlEvents controlEvents;
  14. @end
  15. @implementation BKControlWrapper
  16. @synthesize handler, controlEvents;
  17. - (id)initWithHandler:(BKSenderBlock)aHandler forControlEvents:(UIControlEvents)someControlEvents {
  18. if ((self = [super init])) {
  19. self.handler = aHandler;
  20. self.controlEvents = someControlEvents;
  21. }
  22. return self;
  23. }
  24. - (id)copyWithZone:(NSZone *)zone {
  25. return [[BKControlWrapper alloc] initWithHandler:self.handler forControlEvents:self.controlEvents];
  26. }
  27. - (void)invoke:(id)sender {
  28. self.handler(sender);
  29. }
  30. - (void)dealloc {
  31. self.handler = nil;
  32. [super dealloc];
  33. }
  34. @end
  35. #pragma mark Category
  36. @implementation UIControl (BlocksKit)
  37. - (void)addEventHandler:(BKSenderBlock)handler forControlEvents:(UIControlEvents)controlEvents {
  38. NSParameterAssert(handler);
  39. NSMutableDictionary *events = [self associatedValueForKey:&kControlHandlersKey];
  40. if (!events) {
  41. events = [NSMutableDictionary dictionary];
  42. [self associateValue:events withKey:&kControlHandlersKey];
  43. }
  44. NSNumber *key = [NSNumber numberWithUnsignedInteger:controlEvents];
  45. NSMutableSet *handlers = [events objectForKey:key];
  46. if (!handlers) {
  47. handlers = [NSMutableSet set];
  48. [events setObject:handlers forKey:key];
  49. }
  50. BKControlWrapper *target = [[BKControlWrapper alloc] initWithHandler:handler forControlEvents:controlEvents];
  51. [handlers addObject:target];
  52. [self addTarget:target action:@selector(invoke:) forControlEvents:controlEvents];
  53. [target release];
  54. }
  55. - (void)removeEventHandlersForControlEvents:(UIControlEvents)controlEvents {
  56. NSMutableDictionary *events = [self associatedValueForKey:&kControlHandlersKey];
  57. if (!events) {
  58. events = [NSMutableDictionary dictionary];
  59. [self associateValue:events withKey:&kControlHandlersKey];
  60. }
  61. NSNumber *key = [NSNumber numberWithUnsignedInteger:controlEvents];
  62. NSSet *handlers = [events objectForKey:key];
  63. if (!handlers)
  64. return;
  65. [handlers each:^(id sender) {
  66. [self removeTarget:sender action:NULL forControlEvents:controlEvents];
  67. }];
  68. [events removeObjectForKey:key];
  69. }
  70. - (BOOL)hasEventHandlersForControlEvents:(UIControlEvents)controlEvents {
  71. NSMutableDictionary *events = [self associatedValueForKey:&kControlHandlersKey];
  72. if (!events) {
  73. events = [NSMutableDictionary dictionary];
  74. [self associateValue:events withKey:&kControlHandlersKey];
  75. }
  76. NSNumber *key = [NSNumber numberWithUnsignedInteger:controlEvents];
  77. NSSet *handlers = [events objectForKey:key];
  78. if (!handlers)
  79. return NO;
  80. return handlers.count;
  81. }
  82. @end