Swiftgram/Display/UIBarButtonItem+Proxy.m
2017-02-11 17:02:35 +03:00

99 lines
2.8 KiB
Objective-C

#import "UIBarButtonItem+Proxy.h"
#import "NSBag.h"
#import "RuntimeUtils.h"
static const void *setEnabledListenerBagKey = &setEnabledListenerBagKey;
static const void *setTitleListenerBagKey = &setTitleListenerBagKey;
static const void *customDisplayNodeKey = &customDisplayNodeKey;
@implementation UIBarButtonItem (Proxy)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
[RuntimeUtils swizzleInstanceMethodOfClass:[UIBarButtonItem class] currentSelector:@selector(setEnabled:) newSelector:@selector(_c1e56039_setEnabled:)];
[RuntimeUtils swizzleInstanceMethodOfClass:[UIBarButtonItem class] currentSelector:@selector(setTitle:) newSelector:@selector(_c1e56039_setTitle:)];
});
}
- (instancetype)initWithCustomDisplayNode:(ASDisplayNode *)customDisplayNode {
self = [self init];
if (self != nil) {
[self setAssociatedObject:customDisplayNode forKey:customDisplayNodeKey];
}
return self;
}
- (ASDisplayNode *)customDisplayNode {
return [self associatedObjectForKey:customDisplayNodeKey];
}
- (void)_c1e56039_setEnabled:(BOOL)enabled
{
[self _c1e56039_setEnabled:enabled];
[(NSBag *)[self associatedObjectForKey:setEnabledListenerBagKey] enumerateItems:^(UIBarButtonItemSetEnabledListener listener)
{
listener(enabled);
}];
}
- (void)_c1e56039_setTitle:(NSString *)title
{
[self _c1e56039_setTitle:title];
[(NSBag *)[self associatedObjectForKey:setTitleListenerBagKey] enumerateItems:^(UIBarButtonItemSetTitleListener listener)
{
listener(title);
}];
}
- (void)performActionOnTarget
{
if (self.target == nil) {
return;
}
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self.target performSelector:self.action];
#pragma clang diagnostic pop
}
- (NSInteger)addSetTitleListener:(UIBarButtonItemSetTitleListener)listener
{
NSBag *bag = [self associatedObjectForKey:setTitleListenerBagKey];
if (bag == nil)
{
bag = [[NSBag alloc] init];
[self setAssociatedObject:bag forKey:setTitleListenerBagKey];
}
return [bag addItem:[listener copy]];
}
- (void)removeSetTitleListener:(NSInteger)key
{
[(NSBag *)[self associatedObjectForKey:setTitleListenerBagKey] removeItem:key];
}
- (NSInteger)addSetEnabledListener:(UIBarButtonItemSetEnabledListener)listener
{
NSBag *bag = [self associatedObjectForKey:setEnabledListenerBagKey];
if (bag == nil)
{
bag = [[NSBag alloc] init];
[self setAssociatedObject:bag forKey:setEnabledListenerBagKey];
}
return [bag addItem:[listener copy]];
}
- (void)removeSetEnabledListener:(NSInteger)key
{
[(NSBag *)[self associatedObjectForKey:setEnabledListenerBagKey] removeItem:key];
}
@end