UITableViewControllerをUIViewControllerに切り替える
以前に日記UITableViewController上に配置したUITableViewでヘッダ(tableHeaderView)をスクロールさせずに固定するTipsを書いた。
tableHeaderViewを固定にするコード
-(void)scrollViewDidScroll:(UIScrollView *)scrollView { // ヘッダViewを取得 UIView* headerView = [[self tableView] tableHeaderView]; // UITableViewのスクロールに合わせて表示位置を固定 [headerView setFrame:CGRectMake(headerView.frame.origin.x, self.tableView.contentOffset.y, headerView.frame.size.width, headerView.frame.size.height)]; }
このTipsは非常に手軽で便利なのだが、iOS6ではtableView.contentOffsetにバグがあるようで今までのようにフリーズしてくれなくなった。(以前のほうがバグだったのかもしれないが)
他に方法はないかと色々試しては見たが、すぐには上手くいかないようなのでデザインを変えずにxibとコントローラの構成自体を変えることにした。
UIViewControllerベースの構成
Constraintsという新しい要素が出てきているが、今は無視する。
新たな構成ではVIewとUITableViewが完全に分離しているので、先に紹介したコードは不要になる。(iOS6でも問題なくヘッダビューは固定配置となる)その代わり、元々UITableViewControllerが自動的に処理していたUITableViewの二つの重要なデリゲート(UITableViewDelegate, UITableViewDataSource)を処理しなくなるので、コードには以下の修正が必要になる。
NewUIViewController.h
@interface NewUIViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>
〜
NewUIViewController.m
@interface NewUIViewController () //新しいtableViewプロパティ (IBOutletで接続する) ● @property (weak, nonatomic) IBOutlet UITableView *tableView; @end @implementation NewUIViewController - (void)viewDidLoad { [super viewDidLoad]; 〜 //テーブルビューのデリゲート設定 self.tableView.dataSource = self; self.tableView.delegate = self; }
以上の修正を行いUITableViewをtableViewプロパティにIBOutletで接続することで、以前にUITableViewControllerベースだったコードがそのまま動くだろう。