ホーム

トップ
準備
Become An Xcoder

練習問題0
練習問題1
練習問題2
練習問題3
練習問題4
練習問題5
練習問題6
練習問題7
練習問題8
練習問題9
練習問題10
練習問題11
練習問題12
練習問題13
練習問題14
練習問題15

C言語補習1
C言語補習2
C言語補習3

推薦図書
ブックマーク

最後に

掲示板

Cocoa Docs

自作ソフトいろいろ




修正日: 09/02/23  

練習問題14  

 解答編


 ごめんなさい。実は練習問題14はここまでの知識では基本的に解けません。非常に強引な方法を使えば可能ですが、それではバインドを使う意味が無くなってしまいます。ここまでの知識で解決しようとすると、以下のような手順になると思います。これでは実はダメなのですが、ここまで考えつくことができたらそれで大正解です。

1. 体重と身長の変化を受け取るアクションを作る。
2. BMIの変化を受け取るアクションを作る。
3. 体重・身長のスライダーとテキストフィールド計四つを1のアクションに接続する。
4. BMIのスライダーとテキストフィールドを2のアクションに接続する。
5. 体重身長変化のアクションが呼ばれたらBMIを計算してセットする。
6. BMI変化のアクションが呼ばれたら体重を計算してセットする。

 これで満点です。・・・残念ながらこれでは正しく動きませんが。問題はここです。

  bmi=weight/(height/100)/(height/100);
  weight=bmi*(height/100)*(height/100);

 「練習問題13」で値が変更されたら、その値にバインドされた他のオブジェクトの値も変わる、と書きました。このコードでちゃんと値が変わるのになぜ、とお思いでしょうか、実はこのように単純に値を代入するだけではダメなのです。「NSKeyValueCoding Protocol」の

 - (void)setValue:(id)value forKey:(NSString *)key;

というメソッドを使う必要があります。「value」に変更後の値、「key」に値の名前をNSString形式で渡します。例えばAというオブジェクトのインスタンス変数「height」をBという値に変えたい場合

 [A setValue:B forKey:@"height"];

と書きます。変更後の値の型が「id」であることにも気をつけてください。floatのような変数ではなく、オブジェクトを渡す必要があります。floatをセットしたい場合はNSNumberというオブジェクトを使います。数値を扱うためのクラスです。「numberWithFloat:」というクラスメソッドでfloatからNSNumberオブジェクトを作ることができます。

 ここまで練習問題をやってきたら、わからない事を調べる事にも大分慣れてきた事と思いますので、あまり細かな説明はやめておきます。ここまでの解説(ヒントというべきかもしれませんが)を元に、ちゃんと動くように改造してください。