iPhone 開発 アーカイブ
UITableViewCell の accessoryView というプロパティについてです。それほどマイナーなプロパティでもないので、実は当たり前なのかもしれませんが、最近便利さに気付いたので紹介します。
UITableViewCell には accessoryType というプロパティがあって、3種類のアクセサリが付けられます。
先週の荻野のブログエントリではアプリケーション上の各要素間の間隔について書かれていました。デザイナが導き出した各要素間の間隔を限りなく忠実にコーディングするための助けとなるツールを紹介したいと思います。
xScope
iOS のアプリ開発における主役クラスの1つである UIViewController。中でも、実用系のアプリを作る際には UITableView を表示するための UITableViewController が活躍してくれます。Xcode の新規クラスのテンプレートにも含まれていますね。
UITableViewController は UIViewController のサブクラスで、UITableViewDataSource と UITableViewDelegate という、UITableView を扱うのに必要な2つのプロトコルに適合しています。UITableView を表示する画面なら、基本的に UITableViewController クラスだけで事足りてしまいます。
とても便利なクラスである反面、複雑な処理をしようとすると、どんどん肥大化してしまうという欠点もあります。原因の1つとして、UITableViewController が次の3つのクラス/プロトコルの役割を1クラスで担っている点が考えられます。
- UIViewController
- UITableViewDataSource
- UITableViewDelegate
開発者のみなさん、Mac OS X のソフトウェアアップデートやインストーラが途中で止まってしまって困ったことはありませんか?私はあるアップデートのインストール中ににっちもさっちも行かなくなって、念のためコンソールを確認してみたところ、次のような気になるメッセージが出ていました。
Software Update[7014] *** -[NSMachPort handlePortMessage:]: dropping incoming DO message because the connection or ports are invalid
何やら DO (Distributed Object) がらみで何かありそうですね。とは言ってもこれだけでは手の打ちようがないので、上記メッセージを元にウェブを検索してみると、Apple Discussions のスレッドにたどり着きました。
iPhone アプリを作成するのに欠かせないのが Xcodeですね。このリッチで優秀な IDE は今も着実に改良を重ね次第に使いやすくなっています。このような環境で開発できることは大変幸せなことであるわけですが、不幸にも僕の体はもはや Emacs 以外のエディタを使うことができません。とりあえずは Xcode の外部エディタに Emacs を設定して急場を凌いでいるわけですが、Xcode の各種機能は組み込みエディタと強力に連携しており、外部エディタを使用しているマイノリティは、大変肩身の狭い思いをしていると言わざるを得ないでしょう。
この状況を改善しなければなりません。そこでその第一歩目として AppleScript 経由で Xcode に以下の操作をさせてみたいと思います。
- ビルド
- デバッグ開始
- 指定したファイルを開く
これができれば、外部エディタからこれらの操作ができることになるので夢が広がりますね。
データのダウンロード中など待ち状態のときに、画像をくるくる回して読み込み中だということを表したいことってありますよね。アニメーション GIF や複数の画像の切り替えでも表現できますが、今回は1枚の画像を Core Animation の transform プロパティを使って回す方法を紹介したいと思います。
まず、アニメーションには CABasicAnimation を使います。作成するときに、animationWithKeyPath に transform をセットします。
iOS SDK 4 から追加された UIAutomation について調べてみました。
UIAutomation を使えば、JavaScript で UI の自動テストが可能になります。Instruments 上でターゲットのアプリと JavaScript のファイルをつなぐと実行できます。
詳しい導入方法はドキュメントを見てもらうとして、何ができるかをまとめてみました。
あるメソッドを一定時間後に実行したい、ということはよくあります(これを、メソッドの遅延実行と呼ぶことにします)。そんなときにまず思いつくのは NSTimer を使う方法ではないでしょうか。
NSTimer を使う以外にも、NSObject にある次のメソッドで簡単に同じことができます。
NSObject - (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay
例として、iPhone 標準搭載の写真アプリを見てみましょう。
アプリがクラッシュする原因はさまざまです。その中でも、解放(dealloc)済みオブジェクトへのアクセス (EXC_BAD_ACCESS) によるクラッシュの原因としてありがちなイージーミスを2つ挙げてみます。
インスタンス変数に autorelease なオブジェクトをそのまま代入
インスタンス変数は通常そのクラスのインスタンスがオーナーシップを持つ必要があります。この場合の典型的な書き方として次の2つが挙げられます。
- retain で宣言されているプロパティ経由でオブジェクトを代入する場合(self.button = aButton;)
- インスタンス変数に代入するときに retain 等 retainCount を増やすメッセージを送っておく場合(button = [aButton retain];)
この2つの書き方が混在していると次のような間違いが起こりがちです。
スマートフォンアプリケーション企画担当の荻のです。
基本的に技術屋さんではないのでプログラミングに関わるお話しは全然できませんが、それ以外、特に企画段階でのアプリケーションを作るときのポイントを紹介できれば、と思っています。
今回のお題は「開発前に決めておくべきこと」です。
アプリ開発で一番最初に決めること、そして一番じっくり考えて明確にしておかないといけないことは、今から開発するアプリケーションが「何に使うものなのか」ということです。
え、それってあたりまえのことなんじゃ?と思われるかもしれませんが、ここを開発前に絞りきれていなくて中途半端なアプリケーションができあがってしまうことが意外と多いようです。
アプリが小気味よく動くようにするために、メインスレッドでの重たい処理を避けて、適宜バックグラウンドスレッドに処理を回すことはよくあります。
このとき注意が必要なのは、バックグラウンドでの処理結果を画面に反映させる時の以下のお約束です。
UIKit のオブジェクトはメインスレッド以外からアクセスしてはいけない
Apple のドキュメントとしては Cocoa Fundamentals Guide に “All UIKit objects should be used on the main thread only” と書いてあります。この制限は UIKit 特有ではなく、Java の Swing などでも共通の設計です。GUI のパフォーマンスを良くするために、スレッドセーフをあえて捨てて単純化しているのです。
ではどうすれば良いのかと言うと、バックグラウンドスレッドからメインスレッドに処理を渡すために、NSObject にある次のメソッドを使います。