Frage

Ist das möglich ein UIToolbarButton ein Objekt zu seinem Ziel durch Verwendung von etwas exoteric Methode Pass (da es nicht möglich zu sein scheint regelmäßig Taste Gebrauch verwendet wird)?

Ich meine, so etwas wie

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

Ich weiß, ich kann ein Verfahren auslösen, der die vollständige Methode mit dem Objekt starten wird, aber aus Gründen der Eleganz ich den Code zu minimieren versuche ... Ich vermute, dass es nicht möglich ist, sondern wie ihr da draußen irrsinnig gut Sie mit einer transzendentalen Antwort kommen können ... wer weiß ...

War es hilfreich?

Lösung

Sie müßten die UIBarButtonItem Klasse erweitern.

Hier ist ein Beispiel der Schaffung RCBarButtonItem Klasse. Ich verwendet habe, für eine einfache initwithtitle, ich bin sicher, dass Sie es ändern könnte ...

Die UIBarButtonItem Subclass

#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

Dann könnte dies dann wie so umgesetzt werden:

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

Andere Tipps

Was ich in dieser Situation getan ist eine NSDictionary Eigenschaft erstellen genannt, sagen wir, buttonArguments:

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

Dann in Ihrer doSomething: Methode suchen, um das Objekt auf der Grundlage des sender Parameter auf.

ich lieber mit Kategorien:

  

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top