iPod Touch その5

Cocoaから見たCocoa Touch

Mac OS XのアプリケーションをCocoaで作っている人にとっては、iPhone/iPod TouchCocoa Touchの習得はそう難しいことではないと思う。Objective-Cという言語とFoundationフレームワークはほぼ共通のものだから。ただしGUI担当、UIKitはCocoaのAppKitとはかなり違っている。クラス名が似通っているからといって、同じような機能を持つわけでもない。以下一昨日あたりに私が戸惑ったこと。

リファレンスがプロパティだらけ

Objective-C 2.0でプロパティ構文が導入されたのはCocoaではLeopardからだけど、Cocoa Touchでは最初からプロパティ全開。setterやgetterのメソッドが載っていたりはしない。プロパティこんなのあります、これはread onlyです、以上。

UIWindowはUIViewのサブクラスである

AppKitではNSWindowとNSViewに継承関係はない。UIKitでは大抵アプリケーションはUIWindowを作って、その中のsubviewsを切り替えて画面遷移したりなんかする。

UIViewController

上記のようにAppKitでのウインドウに相当するものをUIKitではビューがやっていることが多い。というわけで、UIViewControllerは役割としてNSWindowControllerにあたると考えると分かりやすいと思う。実際例えばAppKitではアプリケーションに独立したウインドウを追加するときに、NSWindowControllerのサブクラスを作り、initWithWindowNibName:でウインドウ以下GUIの保存されたnib(xib)を読み込み、そのFile's Ownerになるというのが定石だが、UIKitでもUIViewControllerがxibを読み込んでFile's Ownerになり、ルートビュー以下のビューたちを管理する。
IB上ではUIViewControllerを新規作成すると、自動的にルートビューを内部に持っていたりする。けれど実際にはそれを削除してしまって、別途xibの名前を指定しておくことも出来るし、コードからやってもいいしであまりIBが勝手に作ってくれるルートビューを使う機会がないような気がする。

UITableView

継承関係でいえばこれもUIScrollViewのサブクラスで、AppKitとはまた違う。dataSourceやdelegateを使うのはAppKitと同じ。そしてデータを表示するのにUITableViewCellを使うのだが、どうもUIKitにはAppKitのControlとCellみたいな関係はないらしく、Cellと付くのはこのクラスくらいである。しかもUITableViewCellはcontentView以下に内容表示用のビューを持っており、AppKitとは全く逆である。似ているのは名前だけで、継承関係や構造はAppKitとは全く違うということを覚えておくべき。

UITextView

これも似て非なるいい例で、NSTextViewはリッチテキストを扱えるけれどUITextViewはビュー全体のフォントや色は変えられてもリッチテキストは扱えない。リッチテキスト表示したけりゃUIWebView使え、って書いてあった。ていうか、Cocoa TouchにはNSAttributedStringがないみたい。CFAttributedStringはあるらしい。