iphone - 传递一个对象上的UIToolbarButton行动
-
18-09-2019 - |
题
是可能使一个UIToolbarButton传递对象到其目标通过使用一些方法明传(因为它似乎不使用常规的按钮用途是可能的)?
我的意思是这样
UIBarButtonItem *Button = [[UIBarButtonItem alloc] initWithImage:buttonImage
style:UIBarButtonItemStylePlain target:self action:@selector(doSomething:) **withObject:usingThis**];
我知道我可以触发将与对象推出全法的方法,但优雅,我试图尽量减少代码的缘故...我怀疑这是不可能的,但你的球员,有有出奇的好,你可能会与超越的答案...谁知道...
解决方案
您将不得不延长的UIBarButtonItem类。
下面是一个例子创建RCBarButtonItem类。我用initWithTitle为方便,我相信你可以改变它......
的子类的UIBarButtonItem
#import <UIKit/UIKit.h>
@interface RCBarButtonItem : UIBarButtonItem {
id anObject;
}
@property (nonatomic, retain) id anObject;
- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action withObject:(id)obj;
@end
@implementation RCBarButtonItem
@synthesize anObject;
-(void)dealloc {
[anObject release];
[super dealloc];
}
- (id)initWithTitle:(NSString *)title style:(UIBarButtonItemStyle)style target:(id)target action:(SEL)action withObject:(id)obj {
if (self = [super initWithTitle:title style:style target:target action:action]) {
self.anObject = obj;
}
return self;
}
@end
那么这可能然后像这样来实现:
#import "RootViewController.h"
#import "RCBarButtonItem.h"
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
RCBarButtonItem *button = [[RCBarButtonItem alloc] initWithTitle:@"Hello"
style:UIBarButtonItemStylePlain
target:self
action:@selector(doSomething:)
withObject:@"Bye"];
self.navigationItem.rightBarButtonItem = button;
}
- (void)doSomething:(id)sender {
NSLog(@"%@", [(RCBarButtonItem *)sender anObject]);
}
其他提示
我已经在这种情况下做的是创造一个NSDictionary属性调用,也就是说,buttonArguments
:
self. buttonArguments = [[NSDictionary alloc] initWithObjectsAndKeys: usingThis, Button, ... , nil];
然后在您doSomething:
方法,查找基于该sender
参数的对象。
我更喜欢使用的类别:
的UIBarButtonItem + BarButtonItem.h
@interface UIBarButtonItem (BarButtonItem)
@property (strong, nonatomic) NSDictionary *userInfo;
@end
的UIBarButtonItem + BarButtonItem.m
static void *kUserInfo = &kUserInfo;
@implementation UIBarButtonItem (BarButtonItem)
- (NSDictionary *)userInfo {
return objc_getAssociatedObject(self, kUserInfo);
}
- (void)setUserInfo:(NSDictionary *)userInfo {
objc_setAssociatedObject(self, kUserInfo, userInfo,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
不隶属于 StackOverflow