NSSliderをいっこだけ配置したアプリケーションを作ってみる。
構造は極めて単純で
- NSSliderのvalueには AppDelegateの sliderValueプロパティを bindする
- sliderの操作は AppDelegateの sliderActionで受ける
実装も単純に。
setSliderValue
-(void)setSliderValue:(NSInteger)v
{
NSLog(@"setSliderValue");
if (_sliderValue == v)
return;
_sliderValue = v;
}
sliderAction
-(IBAction)sliderAction:(id)sender
{
NSLog(@"sliderAction");
}
で、実行してみた
2014-05-17 09:59:49.638 SliderActionAndBind[1832:303] setSliderValue
2014-05-17 09:59:49.639 SliderActionAndBind[1832:303] sliderAction
2014-05-17 09:59:52.174 SliderActionAndBind[1832:303] setSliderValue
2014-05-17 09:59:52.175 SliderActionAndBind[1832:303] sliderAction
2014-05-17 09:59:52.960 SliderActionAndBind[1832:303] setSliderValue
2014-05-17 09:59:52.960 SliderActionAndBind[1832:303] sliderAction
...
どうやらプロパティの変更→アクションの実行の順で行われるようだ。他のコントロールは試してないし、実行のたびに変わるのかもしれない。この辺Appleの公式ドキュメントのどこに書かれているんだろう・・・
そもそもプロパティの setterだけでいいんじゃないの
アクションとプロパティを別々に書く必要なんてあるの、setterの中にactionの処理書いても同じなんじゃない、という話もあるんだけど、そうとも言えない問題が起きたのが今回の疑問の発端。
この辺についてもうちょっと書こうと思ったけど少し考えをまとめてから別記事に。