バインディングを開始するために、私は摂氏温度をケルビンの温度に変換する小さなアプリケーションを作成しています。オブザーバに通知する - バインディングを開始する
私はfloat kelvin
とfloat centigrade
という2つのプロパティにバインドされた2つのNSTextFieldを持っています。もちろん、それぞれのプロパティの値を適切に設定する2つのカスタムセッタがあります。摂氏ため
セッターは次のとおりです。
centigrade = value;
[self willChangeValueForKey:@"kelvin"];
kelvin = value + 273;
[self didChangeValueForKey:@"kelvin"];
私はそうでない場合、値が他のNSTextFieldで更新されていないwillChangeValueForKey:
を使用する必要があります。
私の質問は、これを行うよりエレガントな方法はありますか?気温を華氏に変換する別のプロパティとテキストフィールドを追加した場合、そのゲッタにwillChange...
とdidChange...
を追加する必要があります。
nibファイルにこれらの2つのプロパティがリンクされていることを伝える方法はありますか?変更するたびに、両方のオブザーバに通知する必要がありますか?
EDIT:
何の価値については、私はcentrigradeのセッターの内側からケルビンのセッターを呼び出して試してみました。しかし、私がケルヴィンのためにセッターでそれを行う場合、それは問題を引き起こしませんか?例えば:/didChangeValueForKey:
centigrade = value;
[self setKelvin:value];
と
kelvin = value;
[self setCelsius:value];
私は完全にオフトラックだったと感じました。私は私のモデルKVOに準拠させる必要があると推測しているだけで、2つのフロートプロパティを持つことはそれをカットするつもりはありませんか?さらに、私はカスタムセッターを一切必要としていないと主張しています。ケルビンを摂氏に変換したり、逆にケルビンを変換するコードが必要なのですか? – saad
私は+ keyPathsForValuesAffectingValueForKeyもオーバーロードしていますが、それもうまくいくようです。しかし、私はまだあなたがモデルについて言ったことに熱心です。 FWIW、私は基本的なモデルを持っていますが、カスタムアクセサを削除すると明らかに温度は変わりませんが値は変更されますが、合成されたセッター/ゲッタはまだ呼び出されており、値は更新されます。私は同じプロパティに2つのテキストフィールドを接続し、一方を変更してもう一方を更新することで確認しました。 – saad
もう少し説明を追加しました。モデルについてのポイントは、あなたが複雑なモデルを必要としているということではありません。あなたのビューとは独立して、好ましくは単体テストでそれを開発することが良いということです。 – hooleyhoop