8 | 1月 | 2014 | HMDT Blog

カテゴリー : 2014年 1月8日

iOSでは何故responder chainは重要でないのか


最近はOS Xプログラミングもよくやっているんだけど、iOSではあまり気にしないけど、OS Xではとっても意識するものは、responder chainですね。responder chainについては、Appleのドキュメント「Event Delivery: The Responder Chain」を参照してください。または、昔に書いた「ダイナミックObjective-C (89) デザインパターンをObjective-Cで – Chain of Responsibility (1)」もあわせてどうぞ。

どういうものかというと、普通iOSでボタンにターゲットとアクション設定するときは、addTarget:action:forControlEvents:を使うでしょ。このとき、ターゲットとなる第一引数に特定のオブジェクトじゃなくて、nilを指定します。そうすると、ボタンを押したときのアクションは、そのイベントを受け取ってくれる人(actionに対応するメソッドを持っている人)まで数珠つなぎに送られていくのです。これが、反応の連鎖をたどる、ということでresponder chainって呼ばれます。

OS Xプログラミングをやっていると、このresponder chainをとてもよく使うんですよ。なんでかなと考えてみると、OS Xで何らかの操作を行うときは、まず対象をマウスで選択して、メニューからコマンドを実行する、という流れになります。このとき、操作対象とメニューのコマンドには、強い結びつきがないんですね。たとえば、コピーというコマンドは、いろんな対象に対して送られる可能性があります。

それに対してiOSでは、多くの場合1つのタッチ操作で、対象の選択とコマンドの実行を実現しています。つまり、対象とコマンドが一対一関係ですね。その方が直感的でよろしいです。でも、機能が多くなってくると、「対象×コマンド」の数だけボタンを用意しなくてはいけないので、無理が出てくるんですよね。

ということで、マウス/キーボードのインタフェースと、タッチのインタフェースとでは、自ずとイベントハンドリングのプログラミングスタイルが変わってくるんです、という話でした。