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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top