『たのスイ』への質問の答え
『たのスイ』の方、色々と質問もいただいています。初心者向けを謳っている本なので、丁寧な説明をこころがけはしました。ですが、iOSは2.0から連綿とアップデートを続けていて、プログラミングのスタイルが変わったり、歴史的な経緯があるものもあります。そういったものをこの本で説明してもしょうがないよな、という気もします。でも気になるっちゃ、気になりますよね。
そんな質問が来たので、ここでも紹介です。
質問:P177(5-2 Playgroundでテーブルを使ってみよう!)で、テーブルビューへのセルのregisterClassを実行しなくとも、なぜセルが表示されるのでしょうか?
答え:テーブルビューを使うときに、もし何の工夫もしなければ、セルは行の数だけ必要になります。ですが、もしテーブルに1000行あったときに、セルのインスタンスを1000個作るとしたら、メモリが無駄になります。そこで、画面に表示されるだけのセルのインスタンスを作り(10個程度)、それ以降はスクロールするたびに前に作ったセルを再利用します。
そのために、セルであるUITableViewCellの初期化を行うときに、init(style, reuseIdentifier)というメソッドを使います。第二引数に、再利用のための識別子を指定します。一度作ったセルを再利用するには、テーブルであるUITableViewのdequeueReusableCellWithIdentifier(identifier)を使って、セルを取得します。
これらを使うと、テーブルビューのデータソースメソッドでセルを作るときは、クラシカルなやり方ではこうなります。
var cell: AnyObject? = tableView.dequeueReusableCellWithIdentifier("cell")
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
}
iOS 2.0ではこんな感じでした。が、その後、セルの内部に配置するビューをxibファイルを使ってグラフィカルにデザインしたい、という要求が出てきます。また、UICollectionViewというクラスも登場し、データソースのあり方をそちらに合わせたいという思惑もあったのでしょう。テーブルビューにxibファイルを登録して、それをもとにテーブルビュー側にインスタンスの作成から管理させるという発想が出てきます。そのために追加されたのが、registerNib(nib, forCellReuseIdentifier)です(iOS 5から)。さらに、クラスを指定するだけで使えるようにしたのが、registerClass(cellClass, forCellReuseIdentifier)です(iOS 6から)。
なので、iOS 8時代のプログラミングでは「テーブルビューにセルクラスを登録し、セルインスタンスをテーブルビューから取得する」という手法になります。
UITableViewCellにはいくつかのスタイルがあり、それによってはdetailTextLabelを使うことができます。ですが、スタイルはセルの初期化時に指定するので、セルクラスを登録するやり方では、それが使えません。そのためdetailTextLabelを使いたいときは、クラシカルな、セルのインスタンスをプログラム側で作成する、という手法を取ることになります。
もっとも、実際にアプリの開発を進めていくと、UITableViewCellをそのまま使うということはほとんどなく、カスタムプロトタイプを使ったりサブクラスを作ったりすることになります。なので、ここで歴史的な経緯を一生懸命紹介してもしょうがないなぁ、という気持ちもあります。しょせん、遊んでいるだけだし。
ということで書籍では、上記の説明を「テーブルに登録したクラスから作るんじゃなくて、データソースメソッドの中で自前でセルを作って初期化しよう。」という一文に収めました。
誰に対しての説明ですか?
本にもでてきていない用語を使って説明していて、何をいっているのかさっぱりです。
ところで、いつになったら、アプリ出ますかね。
11月上旬とコメント欄に記載されていましたが、遅れているなら、ブログで報告ぐらいあっても。
かなり適当な人というのは、本読んでよくわかりましたけど、
待っている人がいるようなので、遅れているなら一言あってもいいと思うんですけどね。
その項に対して疑問を持った方への説明ですね。
アプリ版は、二週間ほど前に申請をして、審査通過待ちです。
いつ出るかは、Apple次第なのでなんとも言えない状態です。
In Reviewで待たされています。
それは自分のことですね。その質問をしたのは自分なので。
ただ、残念ながら、内容の半分は理解できませんでした。
レビューで待たされている件、了解しました。
電子書籍を、特別価格か無料で、というお話に期待していたのですが、アプリを出すとなると本を買ったユーザーへの優待は無し、という事なのでしょうか?
アプリ版は、紙の本を買った人は、無償で読むことができるようになります。
詳細は、公開されてから説明します。
今はAppleの審査待ちです。