1

UIToolbarButtonに、何らかのエキゾチックなメソッドを使用してオブジェクトをターゲットに渡すようにすることは可能ですか(通常のボタンの使用では不可能と思われるため)?

私は次のようなものを意味します

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

オブジェクトを使用して完全なメソッドを起動するメソッドをトリガーできることはわかっていますが、優雅さのためにコードを最小化しようとしていました...それは不可能だと思いますが、皆さんのようにめちゃくちゃ良いです超越的な答えが来るかもしれません...誰が知っていますか...

4

3 に答える 3

4

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]);
}
于 2010-03-09T18:43:26.920 に答える
1

この状況で私が行ったことは、次のような NSDictionary プロパティを作成することですbuttonArguments

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

次に、doSomething:メソッドで、パラメーターに基づいてオブジェクトを検索しsenderます。

于 2010-03-09T18:17:05.893 に答える
0

私はカテゴリを使用することを好みます:

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
于 2014-10-10T15:28:26.463 に答える