iphone - передача объекта в действии UIToolbarButton - PullRequest
1 голос
/ 09 марта 2010

Возможно ли, чтобы UIToolbarButton передавал объект своей цели, используя некоторый экзотерический метод (поскольку это кажется невозможным при обычном использовании кнопок)?

Я имею в виду что-то вроде

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

Я знаю, что могу вызвать метод, который запустит полный метод с объектом, но ради элегантности я пытался минимизировать код ... Я подозреваю, что это невозможно, но, как вы, ребята, есть безумно хорошо, что вы можете прийти с трансцендентным ответом ... кто знает ...

Ответы [ 3 ]

4 голосов
/ 09 марта 2010

Вы должны расширить класс UIBarButtonItem.

Вот пример создания класса RCBarButtonItem. Я использовал initWithTitle для простоты, я уверен, что вы можете изменить его ...

Подкласс UIBarButtonItem

#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

Тогда это может быть реализовано так:

#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]);
}
1 голос
/ 09 марта 2010

В этой ситуации я создал свойство NSDictionary, скажем, buttonArguments:

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

Затем в вашем методе doSomething: найдите объект на основе параметра sender.

0 голосов
/ 10 октября 2014

Я предпочитаю использовать категории:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...