UIViewController + UITableView
- 2013年02月21日
- iOSアプリ開発
■UITableViewControllerからUIViewController+UITableViewへ
今作っているアプリ。
当初UITableViewControllerを使って実装していたのだが、ナビゲーションバーとテーブルの間に広告を表示させるようにしたかった。
方法を模索するもどうやらUITableViewControllerで作ったUITableViewのframeは自由に変更できないような感じ。
そこで仕方なくUITableViewControllerを使わないようにして、UIViewControllerの派生クラスにUITableViewのインスタンスを持たせるように変更した。
こちらのサイトを参考にさせて頂いた。
UIViewControllerをつかって、UITableViewControllerを実装する
■変更時につまづいた箇所
基本的には上記のサイトのように実装を変更した。
が、UITableViewを使うのが初めてでまったく理解できていないのでかなり苦戦。
ベースの知識が違い過ぎるんだよなぁ。
・インターフェイス部にUITableViewDataSource,UITableViewDelegateの二つのプロトコルを採用していることを宣言する必要がある
<UITableViewDataSource,UITableViewDelegate>
・delegateとdatasourceの設定が必要
self.tableView.delegate = self; self.tableView.dataSource = self;
・storyboard上のUITableViewを削除
これだけやってなんとなく動いていると勘違いしてしまったが、シミュレータ上ではstoryboardの中で設置していたUITableViewが見えていてコードで追加した方のUITableViewが使われていなかったので、storyboardの方のUITableViewを削除。
そういえばコードで追加した方のUITableViewはframeも設定していなければaddSubviewもしていなかったのだった・・・(情けない><)
コードで書くのならこれもやんなきゃね。
・dequeueReusableCellWithIdentifier:を使うように変更
storyboardの方のUITableViewを削除した関係で、cellForRowAtIndexPathの中でdequeueReusableCellWithIdentifier:forIndexPath:を使っていた箇所をdequeueReusableCellWithIdentifier:を使うように変更。
dequeueReusableCellWithIdentifier:forIndexPath:の方は、実行前にUITableViewCellを作成しておく必要があったのね。
Important: You must register a class or nib file using the registerNib:forCellReuseIdentifier: or registerClass:forCellReuseIdentifier: method before calling this method.
(※UITableView Class Referenceより)
こんな感じで無事動きました。