UIButtonを継承して文字列を持たせる

phiary に引っ越しました. 毎日プログラミングやWebに関する情報を発信しています! RSS 登録してたまに覗いたり, tweet やハテブして拡散してもらえると幸いです.

Pocket

iPhoneアプリ作ってる友人へと思い制作したものです。
UIButtonにデータを持たせて処理を分岐させたいということだったので、
UIButtonを継承して文字列を持たせてみました。

tagを使えば良いじゃんというツッコミはなしでヨロw
最初は私もそうしたのですが、
やっぱり文字列の方がしっくりきたので、、、

ソース載せておきます。

Source

MyButton.h

#import <UIKit/UIKit.h>

@interface MyButton : UIButton {
    NSString *_data;
}
@property (nonatomic, retain) NSString *data;

-(id)initWithTitle:(NSString*)title data:(NSString*)data;

@end
        

MyButton.mm

#import "MyButton.h"


@implementation MyButton

@synthesize data = _data;


-(id)initWithTitle:(NSString*)title data:(NSString*)data {
    if (self = [super init]) {
        self.data = data;
        
        self.frame = CGRectMake(50, 100, 100, 37);
        [self setTitle:title forState:UIControlStateNormal];
        
        // ここでデザインとかを自由に変更できます
        // 今回は黒地に赤文字というセンス0なデザインでいきます
        [self setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        self.alpha = 0.75f;
        [self setBackgroundColor:[UIColor blackColor]];
    }
    
    return self;
}


- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        // Initialization code
    }
    return self;
}


- (void)drawRect:(CGRect)rect {
    // Drawing code
    // ここでもデザインを変更できます。
}


- (void)dealloc {
    [_data release];
     
    [super dealloc];
}

@end
        

使い方(ViewControllerで使ってます)

- (void)viewDidLoad {
    [super viewDidLoad];
     
    // 白くしておく
    self.view.backgroundColor = [UIColor whiteColor];
     
    // 自作ボタンを生成
    MyButton* button = [[MyButton alloc] initWithTitle:@"title" data:@"hogehoge"];
    button.frame = CGRectMake(50, 50, 100, 37);
     
    // viewに貼り付ける
    [self.view addSubview:button];
    // イベント登録(押すとデータの中身がログに表示されます)
    [button addTarget:self action:@selector(printButtonData:) forControlEvents:UIControlEventTouchUpInside];
    [button release];
}

// イベント関数
// ログに自作ボタンで登録したデータの内容が出力されます。
// ここでdataを使ってリンクっぽい処理につかったりモーダルウィンドウ出したり
// ゴニョゴニョしたりできます
- (void)printButtonData:(MyButton*)button {
    NSLog(@"%@", button.data);
}
    

他にも、”UIControlEventTouchDragEnter”イベント時に色を変えたりすれば、
Webのリンクボタンみたいな感じで使えそうです。

UIButtonは、デフォではstatic関数で生成するからこんなふうに勝手にラップして良いのか
わかりませんがとりあえず動いているので良いのかな?w

以上、ざっくりとした説明でしたが参考なれば幸いです。

私は生粋のIB嫌いなので、
いずれ「InterfaceBuilder撲滅への道」なんて記事でも書こうと思います。

TRACK BACK URL

POST COMMENT

メールアドレスが公開されることはありません。