memorandums

日々の作業ログです。

たのしいCocoaプログラミング(Leopard対応版)ではまる

ちょっと前から少しずつ本書でCocoaのお勉強をしています。iPhoneアプリもそろそろきちんと作ってみたいし、来年の卒研ではそのあたりに興味のある学生さんが何人かいそうなので。今日、子守りをしながらやっと20章中13章くらいまで進みました。


で、本書の本題であるRSSリーダの打ち込みのところ(11章)で2時間くらいはまりました。。。


Cocoaアプリ開発に慣れている人には、当たり前のことだと思いますが、そのことに気づかないのが初心者というもの。。。です。

CocoaではMVCのCにあたるコントロールクラスを作成して、そのクラスをInterface Builder上でNSObjectアイコンを使って?(表現が正しくなさそう)インスタンス化します。そして、そのコントロールクラスと、同じくInterface Builderでデザインしたビュー(クラス)の各部品とをマウスで結線してMVCの連携を定義します。

C#VB.NETなどの.NETではMVCを強要しないので、敷居は低いのですが、何も考えないでプログラムを作ると、イベント処理部に膨大なロジックを書いてしまったり、ビューであるFormクラスにデータを持たせてしまい、改造しにくいプログラムになってしまうことがあります。その点、Cocoaでは(面倒ですが。。。)MVCを意識して開発しましょうね、ということを主張しているようです。


私はプログラムを体で覚えるタイプなので、書籍に掲載されているコントロールクラスのソースを手で入力しました。

で、以下がそのクラスのヘッダーファイルです。これも手で入力しました。続いて、AppControllerクラスの本体も手で入力しました。

@interface AppController : NSObject {
NSXMLDocument* document;
IBOutlet NSTextField* urlTextField;
IBOutlet NSTextField* titleTextField;
IBOutlet NSTextField* linkTextField;
IBOutlet NSTextField* tableView;
}

  • (IBAction)readURL:(id)sender;

@end


で、コントロールクラス内のデータをビューに反映させるために、マウスでAppControllerクラスからNSTableViewクラスへドラッギングしました。下図は成功した場合の例です。

本書の解説ではNSTableViewにドロップできるはずなのですが。。。選択すらできない状態なのです。



困りました。。。エラーが出てくれれば探しようもあるのですがドロップできない。。。となるとどこを調べてよいやらわかりません。


とりあえず、手で入力したソースを読み返したり、ネットで公開されているソースをDLして実行してみたりしました。当然ですが、ネットからDLしたプロジェクトはちゃんと結線できるんです。。。


最終的に悪いのは、上記に掲載したヘッダーファイルで定義しているtableViewの型が間違っていたことが原因でした。ソースコードを入力するときにurlTextFieldの行を入力し、以下をコピペで作成しました。そのとき、NSTextFieldをNSTableViewに変更することを忘れていたことが原因でした。Outletの型が接続先と同じでないとリンクできない、という当たり前のことがわかってしまえば、同じ現象になったときに調べるべきところもわかります。


これは、Interface Builderの設計のポリシーなのだと思いますが、開発者としては「部品と部品を接続したい」という要望をもって操作するわけですから、その操作をさせた上で、その操作ができない理由をエラー表示(型不一致とか、Outletの定義がないとか)してくれると素直だと思うのですが。。。


まだわかりませんが、慣れてくると、このInterface Builderの操作って面倒くさくなるんじゃないでしょうか?ビューのデザインはもちろんグラフィカルにできた方がいいですが、MVCの連携はテキストでも十分ではないかと。マウスを使っても、結局のところリンク先のテキスト(メソッド名など)を選択することになります。以前は、Interface Builderでコントロールクラスが作れたようですが、どうもコントロールクラスの作成が面倒というか作為的というか自然じゃない感じがします。