Domanda

È possibile che per fare un UIToolbarButton passare un oggetto di destinazione utilizzando alcuni exoterica metodo (come sembra non essere possibile con il normale pulsante di utilizzo)?

Intendo qualcosa di simile

UIBarButtonItem *Button = [[UIBarButtonItem alloc] initWithImage:buttonImage
  style:UIBarButtonItemStylePlain target:self action:@selector(doSomething:) **withObject:usingThis**];

So che posso attivare un metodo che lancerà il metodo completo con l'oggetto, ma per il bene di eleganza stavo cercando di ridurre al minimo il codice...Ho il sospetto che non è possibile, ma come voi ragazzi là fuori sono follemente bene si può venire con un trascendentale risposta...chi lo sa...

È stato utile?

Soluzione

Si dovrebbe estendere il UIBarButtonItem classe.

Qui è un esempio la creazione di RCBarButtonItem classe.Ho usato initWithTitle per la facilità, sono sicuro che si potrebbe cambiare...

Il UIBarButtonItem Sottoclasse

#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

Quindi questo potrebbe quindi essere implementato in questo modo:

#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]);
}

Altri suggerimenti

Quello che ho fatto in questa situazione, è quello di creare un NSDictionary proprietà chiamata, dire, buttonArguments:

self. buttonArguments = [[NSDictionary alloc] initWithObjectsAndKeys: usingThis, Button, ... , nil];

Poi nel tuo doSomething: metodo, si cerca l'oggetto, in base alle sender parametro.

Io preferisco usare categorie:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top