Navigation-based ApplicationからUITableViewControllerを外す方法

Navigation-based Applicationで作成したアプリケーションには、RootViewControllerというテーブルを管理するためのクラスが自動的に作成されています。しかし、同クラスはUITableViewControllerというクラスを継承しているため、そのまま利用するとカスタマイズが難しいです。

なので、修正が必要なアプリはUITableViewControllerを継承せず、UIViewControllerを継承するようにすると何かと都合がいいです。そのUITableViewControllerをUIViewControllerに変更するやり方は簡単ですが、多分すぐ忘れるのでメモしておきます。

修正

  • viewDidUnloadとdeallocが抜けていたので追加
  • didRotateFromInterfaceOrientationが親クラスではなくて、自身のを呼び出していたので修正
  1. RootViewControllerのインターフェース宣言を修正し、インスタンス変数を追加する

```--- RootViewController.h ---
// 修正前
@interface RootViewController : UITableViewController
// 修正後
@interface RootViewController : UIViewController<UITableViewDelegate, UITableViewDataSource> {
UITableView *_tableView;
}

<pre><code><br />2. RootViewControllerにプロパティを追加する

```--- RootViewController.h ---
// 既存コード
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;

// 追加コード
@property (nonatomic, retain) IBOutlet UITableView *tableView;

  1. 追加したインスタンス変数のgetterとsetterを用意する

```--- RootViewController.m ---
// 既存コード
@synthesize fetchedResultsController = __fetchedResultsController;
@synthesize managedObjectContext = __managedObjectContext;

// 追加コード
@synthesize tableView = _tableView;

<pre><code><br />4. delegateとdataSourceを設定する

```--- RootViewController.m ---
// 既存コード
- (void)viewDidLoad
{
[super viewDidLoad];

// 追加コード
self.tableView.dataSource = self;
self.tableView.delegate = self;

// 既存コード
// Set up the edit and add buttons.
self.navigationItem.leftBarButtonItem = self.editButtonItem;
...

  1. UITableViewControllerが担っていたメソッドを実装する

```--- RootViewController.m ---
追加コード (*必要ならば)
- (void)setEditing:(BOOL)editing animated:(BOOL)animated {
[super setEditing:editing animated:animated];
[self.tableView setEditing:editing animated:animated];
}

修正前
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}
修正後
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

<pre><code>NSIndexPath *selection = [self.tableView indexPathForSelectedRow];
if (selection) {
[self.tableView deselectRowAtIndexPath:selection animated:animated];
}
[self.tableView reloadData];
</code></pre>

}

修正前
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
修正後
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
// 画面表示後に、一瞬スクロールバーを表示する。
[self.tableView flashScrollIndicators];
}

追加コード
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
// 画面回転後に、一瞬スクロールバーを表示する。
[super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
[self.tableView flashScrollIndicators];
}
修正前
- (void)viewDidUnload
{
[super viewDidUnload];
}
修正後
- (void)viewDidUnload
{
[super viewDidUnload];
self.tableView = nil;
}
修正前
- (void)dealloc
{
[__fetchedResultsController release];
[__managedObjectContext release];
[super dealloc];
}
修正後
- (void)dealloc
{
[__fetchedResultsController release];
[__managedObjectContext release];
[_tableView release];
[super dealloc];
}
```

  1. RootViewController.xibを修正する。

--- RootViewController.xib ---
Viewを追加する。
Table ViewをViewに入れ子にし、サイズをViewと同じ大きさにする。
Table Viewを右クリックし、Connectionsのメニュー表示させる。
OutletsのdataSourceとdelegate、Referencing Outletsのviewを削除する。
File's Ownerを右クリックし、Connectionsのメニュー表示させる。
viewをViewに、tableViewをTable Viewにつなげる。

なお、上記5は、「UITableViewCell stays highlighte」を参考に追加しました。

この記事が役に立った場合、シェアしていただけると励みになります!!