ターゲットアクションなんちゃら
昨日分かってすっきりしたので書こうと思います。
まず、ボタンを作って貼付けるまでです。
これはそんなに問題なく理解できます。
(コメントかきすぎてみにくいですね。実際はこんなに書いてませんw)
// ボタンの作成 UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // ボタンのタイトルや形を設定 [button1 setTitle:@"Touch, me!!" forState:UIControlStateNormal]; // タイトルの長さに応じてボタン自体の大きさを指定する [button1 sizeToFit]; // ボタンのcenterを画面の真ん中に指定 button1.center = self.view.center; // ボタンをタップしたときに指定のメソッドを呼ばせる [button1 addTarget:self // ターゲットはbutton1自身 action:@selector(buttonDidPush:) // タッチされたときに呼ばれるアクション forControlEvents:UIControlEventTouchUpInside]; // ボタンを画面に追加 [self.view addSubview:button1];
次にactionで設定したbuttonDidPush:メソッドの実装です。(buttonDidPushじゃなくてbuttonDidPush:です。引数があるときはコロンを忘れずに。いつも私は忘れてしまいます。)
// ボタンタップ時にこれが呼ばれる - (void)buttonDidPush:(id)sender { if ([sender isKindOfClass:[UIButton class]]) { UIButton *button2 = sender; UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:button2.currentTitle delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; [alert show]; } }
なんかすごくみにくい...
もっと見やすくする方法はないのだろうか...
すみません今回は我慢して下さい...
で、この(id)senderという引数ですね。いきなり何だこいつと思いました。この(id)senderというのは、どのオブジェクトに対する操作なのか知りたい場合に使う見たいです。
この例では,senderがUIButtonクラスかどうかをif文で判定しています。それで、判定の結果UIButtonクラスであればif文の中の処理が行われます。
ここで新しくUIButtonクラスで、button2というオブジェクトを作っていますよね。それに対してsenderを代入しています。この行為の意味が最初全く分からなかったのですが、配列同士の代入を学習して(【第5回】初心者のJavaプログラミング【配列】 - 初心者のJavaプログラミング)、ポインタがふわっと理解できるようになった結果、分かるようになりました。
ずばりこの1文で、senderのアドレスをbutton2に入れているんですね。senderには押されたbutton1オブジェクトの情報が入っていますので、その情報があるオブジェクトのアドレスを新しく作ったbutton2に渡してあげることで、新しく作ったbutton2は前に作ったbutton1を指す訳です。
なので、message:button2.currentTitle では、button1で設定したタイトルが表示される訳です。
ちなみにNSLogで、button1とbutton2のアドレスも確認しました。全く同じアドレスだったので、この考察は正しいのかなと思います。
Objective-Cは周りに聞ける人がいないので、自分で色々調べながら実験して考察してやってます。だから、実は間違った情報を書いているかもしれませんので、参考までにというスタンスで見ていただければ幸いですw
おわり
参考書