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