頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


なぜかUIButtonが動かない!

動的にというのかな、Interface Builderを使わずにコード内でUIButtonクラスを使ってボタンを作ろうとしたんですよ。

ファイルの構成はこの二つでした。
HogeAppDelegate ←おなじみだよね
View1Controller : UIViewController

View1Controller.mにこんな感じで記述してました。
- (void)viewDidLoad {
    [super viewDidLoad];

        UIButton *btn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
        btn.frame = CGRectMake(10, 10, 160, 36);
        [btn setTitle: @"CLICK" forState: UIControlStateNormal];
        [btn addTarget: self action: @selector(clickHandler:) forControlEvents: UIControlEventTouchUpInside];
        [self.view addSubview: btn];
}
- (void)clickHandler: (id)sender {
    NSLog(@"Button clicked!");
}
クリック(ホントはタッチだよな)されるとデバッガコンソールに文字が表示されるはずが、iPhoneシミュレータは落ちてしまう、、、つまりアプリが終了してしまうのです!
なぜだぁー?!

さんざん悩んだあげくに見つけた記事がこれ。
Bugle Diary: [Objective-C][iPhone sdk]UIViewControllerとUIButtonとaddTargetの3角関係

えー、そうなの?
UIViewControllerのサブクラス内に記述するとだめなの?

試しに構成をこのように変えました。
HogeAppDelegate
View1Controller : UIViewController
View1 : UIView ←追加

View1クラスを追加して、その中でボタンを設置し、アクションに対するメソッドもここに記述しました。
つまり、View1.mに
- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {

        // Initialization code
        UIButton *btn = [UIButton buttonWithType: UIButtonTypeRoundedRect];
        btn.frame = CGRectMake(10, 10, 160, 36);
        [btn setTitle: @"CLICK" forState: UIControlStateNormal];
        [btn addTarget: self action: @selector(clickHandler:) forControlEvents: UIControlEventTouchUpInside];
        [self addSubview: btn];
    }
    return self;
}

- (void)clickHandler: (id)sender {
    NSLog(@"Button clicked!");
}
としてみました。
もちろん、View1Controller内でView1クラスのオブジェクトを作成します。
すると、、、めでたくボタンは意図通りに動いてくれました!

うーん、しかし(今回の例だと)View1クラスを記述する必要があるってのは面倒だよなあ、、、
view内にあるボタンが押された時の処理をview controller内に記述するのは不自然ということなんだろうか?

<< ついにこの日が!BIG1000第454回の結果!  TopPage  セルの右の方に飾りで警告が出るぞ? >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/392-9042e697




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad