2013年3月12日火曜日

UIButtonクラスのaddTarget:action:forControlEvents:メソッドの引数について

UIButtonクラスのaddTarget:action:forControlEvents:メソッドは実行時に引数を渡せないので有名(?)です。
他のメソッドであればNSInvocationクラスを使って@selectorに引数を渡す事はできるのですが、addTarget:action:forControlEvents:メソッドでは不可能のようです (こちら参照)。

今回はそのaddTarget:action:forControlEvents:メソッドに引数を渡す方法をメモで。かなり力技でやっとります(笑)

今回は以下のような形で呼び出す場合の例です。

//ボタンが押されたときの処理
[(UIButton*)btn addTarget:self action:@selector(btnDidPush:) forControlEvents:UIControlEventTouchUpInside];

//押されたときに呼ばれるメソッド
-(void) btnDidPush:(UIButton*)button{
//なんかいろいろやる
}

やってみる

それではやっていきます。

今回は、UIButtonを別のクラスとして「CustomButton」クラスを、そしてそれを扱うUIViewControllerクラスを継承した「HogeViewController」クラスを使用します。

CustomButtonクラス

CustomButton.h

#import <UIKit/UIKit.h>

@interface CustomButton : UIButton {
    NSString *_str;
}

@property (nonatomic, retain) NSString *str;

@end

CustomButton.m

#import "CustomButton.h"

@implementation CustomButton

@synthesize str = _str;

-(id)init
{
    if(self=[super init]){
        _str=nil;
    }
    return self;
}
- (void)dealloc {
    [self.str release];
    _str = nil;
    [super dealloc];
}

@end

HogeViewControllerクラス

HogeViewController.h

#import <UIKit/UIKit.h>

@class CustomButton;

@interface HogeViewController : UIViewController
{
    CustomButton *customButton;
}

@property (nonatomic, retain) CustomButton *customButton;

@end

HogeViewController.m

#import "HogeViewController.h"

@implementation HogeViewController

@synthesize customButton = _customButton;

-(id)init
{
    if(self=[super init]){
        self.customButton = [[CustomButton alloc]init];
        //UIbuttonの初期化いろいろ
        [self addSubview:self.customButton];

        NSString *s = @"12345";
        self.customButton.str = s;   //プロパティを介して値をセット

        [self.customButton addTarget:self action:@selector(btnDidPush:) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

- (void)dealloc {
    [self.customButton release];
    _customButton = nil;
    [super dealloc];
}

-(void) btnDidPush:(CustomButton*)button{
    NSLog(@"%@", button.str);  //取得できた値を煮るなり焼くなり
}

やっていることはあまり大したことではないですね。HogeViewControllerクラスでCustomButtonクラスを初期化する際に、プロパティを介して値を渡してあげているだけです。

結構面倒ですね(笑)
もっと良い方法があればいいのですが、これ位しか思いつきません(汗)
addTarget:action:forControlEvents:メソッドで引数を渡せるようにはならないかなあ。

参考記事

UIControl | addTarget:action:forControlEvents: - 福井高専IT研究会OfficialWiki

0 件のコメント:

コメントを投稿