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 を作成することができました。
[ もどる ]