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 ...

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top