2010 8月 at ミネルヴァの梟は黄昏とともに飛び始める

ミネルヴァの梟は黄昏とともに飛び始める

Follow me on Twitter: http://www.twitter.com/dddaisuke

Archive for 8月, 2010

[Xcode] Interface BuilderのIB接続に関する問題

without comments

Xcodeでの開発において、UIの構築で力を発揮するのがInerface Builderだ。Interface Builderを利用すると、ビューとコードを簡単に分離する事ができ、Xcodeでの開発でこれを利用しないのはバカだと断言できるレベルで非常にパワフルな機能を提供してくれる。しかも!デザインセンスが無い人でもそこそこの見た目に仕上げる事ができる。(もちろんInterface Builderはデザイナーとプログラマーの作業分離用に用意されていると思うが、Interface Builderを使ったからと言って、おそらくそんなに都合良くまわら無いと思う)

Interface Builderを利用すると何が便利かと、以下のようにUI上で線を結ぶだけでメンバー変数とテキストフィールドを関連づけたり、メソッドとボタンのクリックを関連づけたりできたりする。また、UIとコード間のデータのやり取りに関する処理はすべて内部で請け負ってくれ、コードを書く側はメンバー変数やメソッドの宣言時に識別子を書いておくだけで、UIの値やイベントが勝手に飛んでくるという手軽さ。

さて、今回のエントリーの本題に入りたいと思うが、このInterface Builderは非常にパワプルである一方、致命的に問題だと思う部分がある。(ちなみに、私は今日現在で1週間程度しかXcodeを触っていないので、勘違いしている可能性が十分にある事を前置きしておく

その問題点は、この関連づけ(コネクション)の一覧を表示する仕組みが存在しない事である。ビュー単位では確認できるのだが、プログラム全体でコネクションの関係を閲覧する事ができない。

なぜこれが問題かと言うと、Controller(ソースコード側)の名前を変更したり削除した際には、Interface Builder側からコネクションを切断するか、コネクションを張り直してやらないとエラーを吐いて落ちるのである。コンパイラかプリプロセッサで弾けば良いと思うのだが、ご丁寧に実行時に落ちてくれる。

しかもXcode側で、名前の変更・削除をした際に、リファクタリングや警告の表示といった事が一切行われないのである。

[<UIViewController 0x55169b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxxxxx

プログラムが落ちる時には、上記のようなエラーを吐いて落ちる。もちろんkey xxxxxで示されるIBOutletの対応がおかしくなっている場合があるが、それは明らかなので、検索などでこのページにたどり着いた方は、おそらくエラーを吐くコードに対応した.xibファイルのコネクションはすべて確認されていると思うのでぜひ次の点を確認して欲しい。

これは、私もハマった点なのだが、Controllerの名前を変更してコネクションの不一致が発生した場合は、そのビューだけでなく、そのビューに遷移する前のビューのボタンなどのコネクションを確認して欲しい。遷移先で利用するControllerが指定されていると思うので、このコネクションを張り直すと動くようになると思う。

———-

Xcode/Interface Builderは全体的に使いにくい部分が結構ある。これは、Apple特有のデザインに偏った部分が問題になっているというよりは、競争が全くないというのが問題になっている気がする。

Appleが用意しているUI framework群が非常に優れているだけに、IDEの使いにくさでマイナスになっているのはもったいない。ぜひとも改善して欲しい。

Written by daisuke

8月 27th, 2010 at 9:05 pm