iphone - il passaggio di un oggetto su un UIToolbarButton azione
-
18-09-2019 - |
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...
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