大家都知道如果給UITableViewController裝載一些資料和控制cell的行為(高度,樣式等)都需要指定UITableView的delegate給自身,一般會使用IB或者在viewDidLoad中寫上self.tableView.delegate = self;然後實作UITableViewDelegate和UITableViewDataSource中的方法,例如:– tableView:cellForRowAtIndexPath: 等等.
那麼如何将實作UITableViewDelegate和UITableViewDataSource的方法脫離出來單獨放在一個新的class中呢?
第一步:建立TableDataDelegate
TableDataDelegate.h
@interface TableDataDelegate : NSObject<UITableViewDelegate,UITableViewDataSource> {
NSArray *_data;//用于cell的資料,你可以選擇自己的方式
}
@property (nonatomic,retain) NSArray *data;
@end
TableDataDelegate.m
#import "TableDataSource.h"
@implementation TableDataSource
@synthesize data = data;
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
.......
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
.......
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
......
}
-(void) dealloc{
[data release];
[super dealloc];
}
@end
該delegate實作了我們需要的方法
myTableController.h
#import "TableDataDelegate.h"
@interface MyTableController : UIViewController {
UITableView *_tableView;
TableDataDelegate *_dataDelegate;
}
@property (nonatomic,retain) IBOutlet UITableView *tableView;
@property (nonatomic,retain) IBOutlet TableDataDelegate *dataDelegate;
@end
在MyTableController中,我定義了TableDataDelegate這個class,這是必須的,因為這裡必須retain它,否則你會運作失敗,接下來還需要将它連接配接到XIB中.
myTableController.m
.....
-(void) viewDidLoad{
//_dataDelegate.data = ...可以在這裡設定你的data,也可以在其他地方,例如viewWillAppear
}
.....
第二步:在IB中建立連接配接

如上圖所示,從Library中拖出Object到我們的XIB中,将class設定為TableDataDelegate,然後将MyTableController中的dataDelegate連接配接到這裡,這一步很重要,我最開始的失敗就差了這一步.然後對應的dataSource和delegate都連接配接到你的UITableView上.
UITableView的連接配接示例
最後是MyTableController的連接配接示例