修正日: 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オブジェクトを作ることができます。
ここまで練習問題をやってきたら、わからない事を調べる事にも大分慣れてきた事と思いますので、あまり細かな説明はやめておきます。ここまでの解説(ヒントというべきかもしれませんが)を元に、ちゃんと動くように改造してください。