123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- //
- // UIControl+BlocksKit.m
- // BlocksKit
- //
- #import <objc/runtime.h>
- #import "UIControl+BlocksKit.h"
- static const void *BKControlHandlersKey = &BKControlHandlersKey;
- #pragma mark Private
- @interface BKControlWrapper : NSObject <NSCopying>
- - (id)initWithHandler:(void (^)(id sender))handler forControlEvents:(UIControlEvents)controlEvents;
- @property (nonatomic) UIControlEvents controlEvents;
- @property (nonatomic, copy) void (^handler)(id sender);
- @end
- @implementation BKControlWrapper
- - (id)initWithHandler:(void (^)(id sender))handler forControlEvents:(UIControlEvents)controlEvents
- {
- self = [super init];
- if (!self) return nil;
- self.handler = handler;
- self.controlEvents = controlEvents;
- return self;
- }
- - (id)copyWithZone:(NSZone *)zone
- {
- return [[BKControlWrapper alloc] initWithHandler:self.handler forControlEvents:self.controlEvents];
- }
- - (void)invoke:(id)sender
- {
- self.handler(sender);
- }
- @end
- #pragma mark Category
- @implementation UIControl (BlocksKit)
- - (void)bk_addEventHandler:(void (^)(id sender))handler forControlEvents:(UIControlEvents)controlEvents
- {
- NSParameterAssert(handler);
-
- NSMutableDictionary *events = objc_getAssociatedObject(self, BKControlHandlersKey);
- if (!events) {
- events = [NSMutableDictionary dictionary];
- objc_setAssociatedObject(self, BKControlHandlersKey, events, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- NSNumber *key = @(controlEvents);
- NSMutableSet *handlers = events[key];
- if (!handlers) {
- handlers = [NSMutableSet set];
- events[key] = handlers;
- }
-
- BKControlWrapper *target = [[BKControlWrapper alloc] initWithHandler:handler forControlEvents:controlEvents];
- [handlers addObject:target];
- [self addTarget:target action:@selector(invoke:) forControlEvents:controlEvents];
- }
- - (void)bk_removeEventHandlersForControlEvents:(UIControlEvents)controlEvents
- {
- NSMutableDictionary *events = objc_getAssociatedObject(self, BKControlHandlersKey);
- if (!events) {
- events = [NSMutableDictionary dictionary];
- objc_setAssociatedObject(self, BKControlHandlersKey, events, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- NSNumber *key = @(controlEvents);
- NSSet *handlers = events[key];
- if (!handlers)
- return;
- [handlers enumerateObjectsUsingBlock:^(id sender, BOOL *stop) {
- [self removeTarget:sender action:NULL forControlEvents:controlEvents];
- }];
- [events removeObjectForKey:key];
- }
- - (BOOL)bk_hasEventHandlersForControlEvents:(UIControlEvents)controlEvents
- {
- NSMutableDictionary *events = objc_getAssociatedObject(self, BKControlHandlersKey);
- if (!events) {
- events = [NSMutableDictionary dictionary];
- objc_setAssociatedObject(self, BKControlHandlersKey, events, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
- }
- NSNumber *key = @(controlEvents);
- NSSet *handlers = events[key];
-
- if (!handlers)
- return NO;
-
- return !!handlers.count;
- }
- @end
|