強引さが優しさに変わるとき
Cocoaにはかなり強引なメソッドがいる。その名もNSControlクラスのtakeDoubleValueFrom:*1。あまりにも強引すぎて、個人的には正直理解しずらい。
メソッド名だけみると、引数に指定されるインスタンスの値を取得するというもの。しかし、戻り値は、void。値を取得しているにも限らず、戻り値が値ではない。
強引な動き
下記ソースを例に動きを見てみる。
[textField takeDoubleValueFrom:slider];
次のように動く。
おいおい、人から取得した値を自分へ勝手に設定するのかい。これは分かりにくい。というより強引すぎる。
強引さは優しさに
とは言え、この強引さは、Interface Builderで使うときは、逆に優しさに変わる。
takeDoubleValueFrom:は、Interface BuilderにおいてプログラムレスでViewを連動させる仕組みに使われる。よくある例だと、Sliderのつまみを動かすと、sliderの値に連動して、textFieldにその値が反映されるというもの。KVB(Key Value Binding)を使って、実現しているのではないのとよく言われるが、そんな小難しいことはしていない。takeDoubleValueFrom:のみを使うことにより実現できる。
具体的には、Interface BuilderでsliderとtextFieldを関連付け*2、実行させると、次のように動く。
- xibファイル読み込み時に、sliderのtargetにtextFieldが設定され、actionにtakeDoubleValueFrom:が設定される。
- sliderのつまみを動かし、sliderの値を変更すると、textFieldのtakeDoubleValueFrom:が呼び出され、textFieldにsliderのvalueが設定される。
- 最後に、textFieldの再表示が行われる。
takeDoubleValueFrom:を使うと、View同士の連動がtargetとactionの設定だけでできる。つまり、Interface Builderにとって、takeDoubleValueFrom:の強引さは優しさに変わる。
最後に
自分で書いても理解しがたい。しかし、この考え方は、Interface Builderを使いこなす上でも肝になる。慣れるしかない。