2011年2月12日土曜日

UITableViewControllerからの脱却

自作の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];
}

とりあえずこのくらいやっておけば問題なさそう。


0 件のコメント:

コメントを投稿