iphone - le passage d'un objet sur une action UIToolbarButton
-
18-09-2019 - |
Question
Est-ce possible de faire un UIToolbarButton passer un objet à sa cible en utilisant une méthode exotérique (car il ne semble pas être possible avec l'utilisation du bouton normal)?
Je veux dire quelque chose comme
UIBarButtonItem *Button = [[UIBarButtonItem alloc] initWithImage:buttonImage
style:UIBarButtonItemStylePlain target:self action:@selector(doSomething:) **withObject:usingThis**];
Je sais que je peux déclencher une méthode qui va lancer la méthode complète avec l'objet, mais pour l'amour de l'élégance que je tentais de minimiser le code ... Je pense qu'il est impossible, mais comme vous les gars là-bas sont incroyablement bien vous pouvez venir avec une réponse transcendantale ... qui sait ...
La solution
Vous devez étendre la classe UIBarButtonItem.
Voici un exemple la création de classe RCBarButtonItem. Je l'ai utilisé initWithTitle pour la facilité, je suis sûr que vous pouvez changer ...
Le UIBarButtonItem général
#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
Ensuite, cela pourrait alors être mis en œuvre comme ceci:
#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]);
}
Autres conseils
Ce que je l'ai fait dans cette situation est de créer une propriété appelée NSDictionary, disons, buttonArguments
:
self. buttonArguments = [[NSDictionary alloc] initWithObjectsAndKeys: usingThis, Button, ... , nil];
Ensuite, dans votre méthode doSomething:
, rechercher l'objet en fonction du paramètre de sender
.
Je préfère utiliser les catégories:
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