前へ Xcc>Cocoa 次へ

アウトレットの作成

アウトレット

めざとい人は気づいてる思うけど Classes > Add Action to MyObject の上に Classes > Add Outlet to MyObject てメニューがあるわけですわ。

Classes > Add Outlet to MyObject

で、一個アウトレット完成。アウトレットはアクションと違い1対1で結びつけないといけないのでスライダー、テキストフィールド2つ用意する必要があるのでもう一回

Classes > Add Outlet to MyObject

とする。

アウトレット

 出口、電気のコンセント。ただし、Cocoaでは出力のみの利用に限定されない。実際のオブジェクトへ伸びるリモート線への差し込み口とでも考えるべきか?

向きが逆になるんだな。

例によってConnectボタンを押して結びつけ。

 これで、myOutlet、myOutlet1 の2つができたので、それぞれをスライダー、テキストフィールドと結びつける。今度は MyObject からスライダー、テキストフィールドに Control +ドラッグ&ドロップをおこなう必要がある。

  • myOutlet→MySlider
  • myOutlet1→MyTextField

として、これでいったんMyObject.mとMyObject.hを更新することにする。ということでもう一回

Classes>Create Files for MyObject

として出てきたダイアログでChooseボタンを押すと、いきなり、

なんて聞かれるわけだけど、これは Overwrite ボタンを押す。 MyObject.h、MyObject.m のどちらにも出るので、どちらも Overwrite ボタンを押す。

Overwrite

 以前にCreateした MyObject.m 、MyObject.h が存在しているので、このテキストをどうあつかったらいいかを聞いている。無条件に書き換えがOverwrite。 Merge は合成。当然合成用の指示が必要となりXcodeではFileMerge.appが呼び出される。

とりあえず、別のスライダーに差し替え〜

でもって Xcode で MyObject.h を見ると

@interface MyObject : NSObject
{
IBOutlet id myOutlet;
IBOutlet id myOutlet1;
}

となってるわけだ。これで MyObject.m 側の

- (IBAction)myAction:(id)sender
{
}

で、myOutlet、myOutlet1が使えるようになったので

- (IBAction)myAction:(id)sender
{
 if (sender == myOutlet)
  [myOutlet1 setIntValue:[sender intValue]];
 if (sender == myOutlet1)
  [myOutlet setIntValue:[sender intValue]];
}

と書いて実行すると、お互いの myAction は解除したのにちゃんと動くわけですわ。

 試しに Interface Builder に戻ってテキストフィールドを削除(テキストフィールドを選んだ状態でEdit>Deleteメニュー実行)。

 代わりに別のスライダーを MyObject の myAction、myOutlet1 に結びつけ(下の絵は myAction への結びつけ、逆方向で myOutlet1 に新しいスライダーを結びつける。 myOutlet1 はテキストフィールドが削除された段階で空になっている)

Xcodeで実行すると〜

連動するわけですね〜。やった〜、いっけ、いっけ、どんどん、いったれ〜と速攻でポップアップメニューに差し替えた人は、あれっと思うことになります。

それは次回のお楽しみ。

if (sender == myOutlet)...

 senderがテキストフィールドならスライダー、スライダーならテキストフィールドを更新するっていう処理なんだけど、興味がある人はこれ。

Objective-C プログラミング言語