12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- //
- // UIBarButtonItem+RACCommandSupport.m
- // ReactiveCocoa
- //
- // Created by Kyle LeNeau on 3/27/13.
- // Copyright (c) 2013 GitHub, Inc. All rights reserved.
- //
- #import "UIBarButtonItem+RACCommandSupport.h"
- #import "RACEXTKeyPathCoding.h"
- #import "NSObject+RACPropertySubscribing.h"
- #import "RACCommand.h"
- #import "RACDisposable.h"
- #import "RACSignal+Operations.h"
- #import <objc/runtime.h>
- static void *UIControlRACCommandKey = &UIControlRACCommandKey;
- static void *UIControlEnabledDisposableKey = &UIControlEnabledDisposableKey;
- @implementation UIBarButtonItem (RACCommandSupport)
- - (RACCommand *)rac_command {
- return objc_getAssociatedObject(self, UIControlRACCommandKey);
- }
- - (void)setRac_command:(RACCommand *)command {
- objc_setAssociatedObject(self, UIControlRACCommandKey, command, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-
- // Check for stored signal in order to remove it and add a new one
- RACDisposable *disposable = objc_getAssociatedObject(self, UIControlEnabledDisposableKey);
- [disposable dispose];
-
- if (command == nil) return;
-
- disposable = [command.enabled setKeyPath:@keypath(self.enabled) onObject:self];
- objc_setAssociatedObject(self, UIControlEnabledDisposableKey, disposable, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
-
- [self rac_hijackActionAndTargetIfNeeded];
- }
- - (void)rac_hijackActionAndTargetIfNeeded {
- SEL hijackSelector = @selector(rac_commandPerformAction:);
- if (self.target == self && self.action == hijackSelector) return;
-
- if (self.target != nil) NSLog(@"WARNING: UIBarButtonItem.rac_command hijacks the control's existing target and action.");
-
- self.target = self;
- self.action = hijackSelector;
- }
- - (void)rac_commandPerformAction:(id)sender {
- [self.rac_command execute:sender];
- }
- @end
|