iPhone - pasar un objeto en una acción UIToolbarButton
-
18-09-2019 - |
Pregunta
¿Es posible hacer una UIToolbarButton pasar un objeto a su destino mediante algún método exotérica (ya que no parece ser posible con el uso regular de botón)?
Me refiero a algo como
UIBarButtonItem *Button = [[UIBarButtonItem alloc] initWithImage:buttonImage
style:UIBarButtonItemStylePlain target:self action:@selector(doSomething:) **withObject:usingThis**];
Sé que puedo desencadenar un método que pondrá en marcha el método completo con el objeto, pero en aras de la elegancia que estaba tratando de minimizar el código ... Sospecho que no es posible, pero como ustedes por ahí se terriblemente bueno puede venir con una respuesta trascendente ... quien sabe ...
Solución
Usted tendría que extender la clase UIBarButtonItem.
Este es un ejemplo la creación de la clase RCBarButtonItem. He usado para facilitar initWithTitle, estoy seguro de que podría cambiarlo ...
El UIBarButtonItem Subclase
#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
A continuación, esto entonces se podría implementar de esta manera:
#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]);
}
Otros consejos
Lo que he hecho en esta situación es crear una propiedad NSDictionary llamada, por ejemplo, buttonArguments
:
self. buttonArguments = [[NSDictionary alloc] initWithObjectsAndKeys: usingThis, Button, ... , nil];
A continuación, en el método de doSomething:
, buscar el objeto basado en el parámetro sender
.
Yo prefiero usar categorías:
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