iphone - passando um objeto em uma ação UIToolbarButton
-
18-09-2019 - |
Pergunta
É possível fazer uma UIToolbarButton passar um objeto para seu destino usando algum método exotérica (como parece não ser possível, utilizando o uso regular botão)?
Eu quero dizer algo como
UIBarButtonItem *Button = [[UIBarButtonItem alloc] initWithImage:buttonImage
style:UIBarButtonItemStylePlain target:self action:@selector(doSomething:) **withObject:usingThis**];
Eu sei que pode desencadear um método que irá lançar o método integral com o objeto, mas por uma questão de elegância eu estava tentando minimizar o código ... eu suspeito que não é possível, mas como vocês estão lá fora, insanamente bom você pode vir com uma resposta transcendental ... quem sabe ...
Solução
Você teria que estender a classe UIBarButtonItem.
Aqui está um exemplo a criação de classe RCBarButtonItem. Eu usei initWithTitle para a facilidade, eu tenho certeza que você pode alterá-lo ...
O UIBarButtonItem subclasse
#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
Então este poderia então ser implementado assim:
#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]);
}
Outras dicas
O que eu fiz nesta situação é criar uma propriedade NSDictionary chamado, digamos, buttonArguments
:
self. buttonArguments = [[NSDictionary alloc] initWithObjectsAndKeys: usingThis, Button, ... , nil];
Em seguida, em seu método doSomething:
, procure o objeto com base no parâmetro sender
.
Eu prefiro usar categorias:
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