自作のAppでこれまではUITableViewControllerを使っていたのだが、TableViewの他にサブビューも表示、例えばAdMobの広告Viewなどを表示させたい場合にはUITableViewControllerではなく、その基底クラスであるUIViewControllerをつかうべしと公式ドキュメント「iOS Table VIewプログラミングガイド」にあるのでそうすることにした。置き換えは比較的簡単で、これまでUITableViewControllerを継承していたクラスをUIVIewControllerから継承させ、明示的にUITableViewDelegateとUITableViewDateSourceを指定してやればいい。つまりは
旧)
@interface MyViewController: UITableViewController <...>
新)
@interface MyViewController:UIViewControler <UITableViewDelegate,UITableViewDataSource,...>
に書き換えるだけでいい。
あとは
@property (nonatomic,retain) IBOutlet UITableView* tableView;
として、これにいままで使っていたUITableViewをIBでつないでアクセスできるようにすればほぼOK.(おっと、IB使わないでもできるけれど、自分はIB使える部分はなるべく使うポリシー)。
これでとりあえずは問題なさそうにみえるけれど、実は2点ほど問題があって、ひとつは選択したセルが非選択状態にならないという問題。これはHIGに反するので「iOS Table Viewプログラミングガイド」に載ってるよう、viewWillAppearをオーバーライドしてやればいい。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:YES];
}
もし、セルを選択してもビューが切り替わらないようなAppの場合はdidSelectRowAtIndexPath内で
[tableView deselectRowAtIndexPath:indexPath animated:YES];
とでもしてやればOKだろう。
もう一つの問題は、NavigationControllerで「Edit」ボタンを押しても編集モードにならない点。これはsetEditingをオーバーライドして、自前で編集モードになるよう呼び出してやればよい。
- (void)setEditing:(BOOL)flag animated:(BOOL)animated {
[super setEditing:flag animated:animated];
[tableView setEditing:flag animated:animated];
}
とりあえずこのくらいやっておけば問題なさそう。