Hatena::Groupiphone-dev

iOS プログラミングメモ

2013-04-21 (Sun)

[] TheElements 23:42  TheElements - iOS プログラミングメモ を含むブックマーク

Appleのサンプルコード見て勉強してます。今回は元素の情報を表示する TheElements から。

このサンプルで使ってるテクニックというのが Readme に書いてあるんだけど、結構盛りだくさん。

Configuring and responding to selections in a tab bar

Displaying information in a tableview using both plain and grouped style table views

Using navigation controllers to navigate deeper into a data structure

Subclassing UIView

Providing a custom UITableViewCell consisting of multiple subviews

Implementing the UITableViewDelegate protocol

Implementing the UITableViewDataSource protocol

Reacting to taps in views

Open a URL to an external web site using Safari

Flipping view content from front to back Creating a reflection of a view in the interface

https://developer.apple.com/library/ios/#samplecode/TheElements/Listings/Readme_txt.html

アプリの構成はシンプルで、UITabViewController の中に4つの UITableViewController があってそれぞれのテーブルは元素のリストがさまざまな条件で並んでいる。

f:id:ktakayama:20130421232308p:image:w200

コードの方でまず最初に目についたのが、AppDelegate で UITabBarController を作ってるところ。UIの基本的な部分は StoryBoard で作られてるんだけど、StoryBoard はかなりシンプルで画面遷移くらいしか表現されていない。UITabBarController > UINavigationController > UITableViewController > UIViewController みたいな。UITabBarController の中も1個のタブしかないし。どうなってんのかと思ったら、AppDelegate で UITableViewController のインスタンスを4回生成してた。こんな風に使いまわしたことはなかったから新鮮だった。

// by name
UINavigationController *navController = [storyboard instantiateViewControllerWithIdentifier:@"navForTableView"];
ElementsTableViewController *viewController =
  (ElementsTableViewController *)[navController topViewController];
dataSource = [[ElementsSortedByNameDataSource alloc] init];
viewController.dataSource = dataSource;
[viewControllers addObject:navController];

// by atomic number
navController = [storyboard instantiateViewControllerWithIdentifier:@"navForTableView"];
viewController = (ElementsTableViewController *)[navController topViewController];
dataSource = [[ElementsSortedByAtomicNumberDataSource alloc] init];
viewController.dataSource = dataSource;
[viewControllers addObject:navController];

…以下続く

tabBarController.viewControllers = viewControllers;

UITableViewController で使うための dataSource がそれぞれ独立したクラスになってて、共通のインターフェイスが ElementsDataSource っていうプロトコルで定義されてる。こういうの自分の場合は親クラス作っちゃったりしてて、こんな感じにプロトコル扱えてなかったなあ。

カスタマイズした UITableViewCell を継承した AtomicElementTableViewCell 内にある要素は viewWithTag で取得するようになってた。これは良くやるね。IBOutlet でつなげることも多い。

AtomicElementView に reflectedImageRepresentationWithHeight: ていうメソッドがあって、View の内容を鏡のように上下反転させた UIImage を返してくれる。Music アプリのカバーフローと同じやつ。

f:id:ktakayama:20130421232310p:image:w200

その他に気付いたことメモ

  • UI の初期化は setupUserInterface ていう名前のメソッド内に書いてあった (AtomicElementFlippedView)
  • property 指定した時に自動でやってくれる setter を上書きするのってなんか怖かったんだけど、結構シンプルな書き方でいいんだなあとか (AtomicElementTableViewCell)
トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130421