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とコントローラの構成自体を変えることにした。

UITableViewControllerベースの構成

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ベースだったコードがそのまま動くだろう。