Hatena::Groupiphone-dev

iOS プログラミングメモ

2013-04-27 (Sat)

[] StateRestore 21:41  StateRestore - iOS プログラミングメモ を含むブックマーク

iOS4 からアプリを終了してもしばらくの間は状態がそのままで次に起動した時は終了時の状態が復元するけど、メモリが少なくなった時とかは必ずしも復元するわけじゃないから、そんな場合にも手軽に状態を復元できるようにするための便利機能が iOS6 で搭載されたというわけで、そのサンプルが StateRestore でした。

Storyboard 上でそれぞれの ViewController に Storyboard ID と Restration ID を指定しておいてから、AppDelegate と ViewController 上で状態の保存・復元用のコードを書くだけでいいと。Info.plist で Application does not run in background (UIApplicationExitsOnSuspend) を YES にすると動きがわかりやすくていいかも。modal を開いてテキストを適当に入力した状態でアプリを終了しても、完璧に復元する。

テーブルの状態管理が少しややこしそうかなあ。モデルの識別子を保存して、復元させる時はその識別子を使って indexPath を得るということをしてるようだ。

- (NSString *) modelIdentifierForElementAtIndexPath:(NSIndexPath *)idx inView:(UIView *)view
- (NSIndexPath *) indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view

Prefix.pch に書いてある MANUALLY_CREATE_VC_FOR_RESTORATION ていうマクロを有効にすると、状態復元時の ViewController の生成処理のサンプルコード(下に書いた長ったらしい名前のメソッドの実行サンプル)が有効になるみたい。

+ (UIViewController *) viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents  coder:(NSCoder *)coder

この viewControllerWithRestorationIdentifierPath は必ずしも使う必要はないわけだけど、たとえばロード済みの Controller を返したりとかそういう感じで使うっぽいとかドキュメントに書いてあるっぽいんだけどよくわからん。

DataSource クラスと Item クラスが超シンプルなデータモデルになってて NSKeyedArchiver で永続化しているので、この辺やったことない人は参考になるかも。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130427

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

2013-04-19 (Fri)

[] DocInteraction 19:47  DocInteraction - iOS プログラミングメモ を含むブックマーク

けっこう前にどっかの勉強会きしかわ さんが紹介しててそれ以来よく使ってる DirectoryWatcher っていうクラスがあるんだけど、上記のサンプルコードに含まれています。

なにをしてくれるのかというと、その名の通りとあるディレクトリの変更を監視してくれるためのクラス。たとえば UIFileSharingEnabled して iTunes とファイル共有する場合、アプリを起動してる最中にファイルを転送したらすぐに反映して欲しいじゃないですか。売れるアプリには必須ですよねきっと。

使い方は簡単で、監視するディレクトリを指定すると

DirectoryWatcher *watcher = [DirectoryWatcher watchFolderWithPath:someDirectory delegate:self];

変更があった場合に delegate で通知してくれる。

- (void)directoryDidChange:(DirectoryWatcher *)folderWatcher;

便利。

ちなみに DocInteraction のサンプルは、UIDocumentInteractionController と QLPreviewController のコードのサンプル。

QLPreviewController は使ったことがないけど、PDF や画像ファイルを単に表示するための viewController みたい。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130419

2013-04-18 (Thu)

NSLocalizedString の使い方について 23:31  NSLocalizedString の使い方について - iOS プログラミングメモ を含むブックマーク

NSLocalizedString の第一引数に指定するのって英語にしてたんですけど、もしかして文章じゃなくて定数とかで使うようないわゆるラベルがいいんですかね。

たとえば NSLocalizedString(@"title for main window", nil) みたいにして、画面に表示する英語のメッセージは en.lproj/Localizable.strings に書くみたいな。

今までは NSLocalizedString に英語のメッセージを入れて日本語を ja.lproj/Localizable.strings に書くだけで、en.lproj/Localizable.strings は使ってない状況でした。

さっきメッセージを変更したいと思った時に気付いたんですけど、長文だと特にプログラム内の文字列と Localizable.strings 内の文字列が一致してるかどうかを意識しないといけなくてなんとなく本質的じゃないよな〜って思ったんで、みんなどんな感じでやってんのかなと疑問に思いました。

ドキュメント読んでも NSString *NSLocalizedString(NSString *key, NSString *comment) と key って書いてあるし、多分こうなんだろうなあ。いまさら気付いた。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130418

2013-04-03 (Wed)

4月1日に行なった無料セールの結果など 20:11  4月1日に行なった無料セールの結果など - iOS プログラミングメモ を含むブックマーク

うちで出してる有料のアプリ SkyBooki単語帳SkyChatViewer を4月1日の丸々24時間だけ無料にしたのでその時の数値なんかを書いておきます。エイプリルフールだったのでなんとなく実行した活動です。

特に宣伝活動とかしなかったというより忘れてたのですが、ありがたいことにいくつかのサイトで取り上げてもらったお陰で SkyBook は無料の総合60位くらいまでいってました。無料セールを検知する Twitterbot も結構いっぱいあるみたいで、沢山ツイートを見かけましたね。

※全部載せられなくてすみません。

というわけで、セールの日とセール直後のセールスが出たので簡単にまとめ。

ここんところの SkyBook の有料ダウンロード数は 4 前後くらいでして、他のアプリも似たりよったりなので SkyBook の数値だけ書いときますね。

3月28日2
3月29日6
3月30日2
3月31日2
4月01日7,765
4月02日21

セール直後の有料ダウンロード数はセール前より増えましたよやったね!と言っても、ランキング見てるとあんま続かなそうなので早々に元の水準に戻ると思うけど…!

それよりも一個びっくりしたことがあって、セールした4月1日に、まったく関係ない無料アプリのダウンロード数が1.5倍〜2.5倍程度増えてました。たとえば 癒しネコ画像 は最近だと70ダウンロード前後なんですが、4月1日は133でした。エイプリルフールってすごいね。

トラックバック - http://iphone-dev.g.hatena.ne.jp/ktakayama/20130403