Vra

Is dit moontlik om 'n UIToolbarButton slaag 'n voorwerp om sy teiken met behulp van 'n paar exoteric metode (soos dit lyk nie moontlik te wees met behulp van gereelde knoppie gebruik)?

Ek bedoel iets soos

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

Ek weet ek kan 'n metode wat die volle metode met die voorwerp sal begin sneller, maar ter wille van elegansie Ek het probeer om die kode te verminder ... Ek vermoed dit is nie moontlik nie, maar as jy ouens daar buite is intens goed jy kan kom met 'n transendentale antwoord ... wie weet ...

Was dit nuttig?

Oplossing

Jy sal hê om die UIBarButtonItem klas uit te brei.

Hier is 'n voorbeeld skep RCBarButtonItem klas. Ek het gebruik initWithTitle vir gemak, ek is seker jy kan dit verander ...

Die UIBarButtonItem Subklas

#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

Toe dit kan dan geïmplementeer word soos so:

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

Ander wenke

Wat ek gedoen het in hierdie situasie is skep 'n NSDictionary eiendom genoem, sê, buttonArguments:

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

Toe ek in jou doSomething: metode, kyk op die voorwerp wat gebaseer is op die parameter sender.

Ek verkies die gebruik van 'n rubriek:

  

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
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top