UITableViewController の機能を独自に実装する : Objective-C プログラミング

PROGRAM


UITableViewController の機能を独自に実装する

UITableView をコントロールするためのクラスとして UITableViewController が用意されています。

これを使えば簡単に UITableView を扱うことができるのですけど、UITableView と併せて例えば iAd の ADBannerView などを見える位置に配置したい場合などには、UIViewController を使う必要が出てくる場合もあります。

UIViewController を使って UITableViewController のように振る舞わせたい場合には、次のような実装で、UIViewController から派生させたクラスを作成することで、実現できる感じでした。

 

まず、たとえば EzTableViewController というクラスを作成してみることにします。

Xcode 4 では UIViewController からの派生クラスを作成すると、基本的なメソッドがオーバーライドされたソースコードが手に入るので、そうするとその後の実装が楽になると思います。

ここでは、Xcode 4 で NSObject からの派生クラスとして EzTableViewController を作成して、必要最低限のメソッドのみを記してみることにします。

 

新しい "Objective-C class" を EzTableViewController という名前で作成したら、ヘッダーファイルを次のように調整します。

 

EzTableViewController.h

// UIViewController を派生元にするために、UIViewController が定義されている UIKit.h を組み込みます。

#import <UIKit/UIKit.h>

 

// 派生クラスを UIViewController にし、インターフェイスとして UITableViewDelegate と UITableViewDataSource を持たせます。

@interface EzTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

{

@private

// インターフェイスビルダーで、ここに UITableView を連結します。

IBOutlet UITableView* tableView;

}

 

// インターフェイスビルダーを使用しない場合は、このプロパティを使って UITableView を設定します。

@property (nonatomic,retain) UITableView* tableView;

 

@end

まず、インクルードするヘッダーファイルを <Foundation/Foundation.h> から <UIKit/UIKit.h> に変更します。

そして、ヘッダーファイルに記載されている派生元を NSObject から UIViewController に変更します。また、UITableView をコントロールする上で必要なインターフェイスとして <UITableViewDelegate> と <UITableViewDataSource> の 2 つを持たせます。

 

実装部分は次のような感じにすることで、最低限の機能を実装することができるようでした。

 

EzTableViewController.m

#import "EzTableViewController.h"

 

@implementation EzTableViewController

 

@synthesize tableView = tableView;

 

- (void)dealloc

{

self.tableView = nil;

 

[super dealloc];

}

 

// ビューが表示される直前に、UITableView の選択を解除して、テーブルの更新を行う必要があるようです。

- (void)viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

 

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated];

[self.tableView reloadData];

}

 

// ビューが表示されたら、UITableView のスクロールバーを点滅させます。

- (void)viewDidAppear:(BOOL)animated

{

[super viewDidAppear:animated];

 

[self.tableView flashScrollIndicators];

}

 

// 編集状態の変更時に、UITableView の編集状態も変更する必要があるようです。

- (void)setEditing:(BOOL)editing animated:(BOOL)animated

{

[super setEditing:editing animated:animated];

 

[self.tableView setEditing:editing animated:animated];

}

 

// UITableViewDataSource プロトコルで必須のメソッドです。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

// 実際の実装では、指定されたセクションの行数を返すようにします。

return 0;

}

 

// UITableViewDataSource プロトコルで必須のメソッドです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

// 実際の実装では、指定された行で使用する UITableCell を返すようにします。

return nil;

}

 

@end

最低限これだけで実装完了です。

あとは、通常の UITableViewController が実装する UITableViewDataSource プロトコルのメソッド(上記の "tableView:numberOfRowsInSection:" や "tableView:cellForRowAtIndexPath:" など)や、UIViewController の "viewDidLoad" メソッド等を実装して、制御を行う形になります。

このようにすることで、UITableView コントロールとその他のコントロールを一括して処理を担える UIViewController を作成することができました。

[ もどる ]