您可以做的是让您的“GenericTableViewController”本身有一个委托。它自己会做大部分工作,但最后它会问它的代表“还有什么要做的吗”?
当代理说“是的,确实有一些东西”时,该代码将被执行,用作数据源、代理或您想要的任何东西。举个例子(请原谅我的代码不准确):
- (void) rowForIndex:(NSInteger)row {
if([delegate respondsToSelector:@selector("TVGetRow:")]) {
return [delegate TVGetRow:row]
} else return Rows[row];
}
此示例假定您有一个 tableview 单元格数组,但应该给您一个好主意。您不需要为该子类头文件实现 UITableViewDataSource,而是使用自定义协议。
编辑:由于显然我不清楚我的目标是什么,请允许我添加一些信息。
基本思想是使用'subclassChild'并通过它'subclassParent'作为GenericTableViewController的代表,而不是使用'subclassChild'作为tableView的类型。(你不应该子类化视图,除非你打算改变它的绘图行为)。
一般层次结构将像这样工作:
subclassChild -> 委托 -> GenericTableViewController <- DataSource/Delegate <- TableView
您需要创建一个 init 方法或一个设置此委托的 setter 方法,以及一个允许您调用函数的简单协议,如下所示:
@interface GenericTableViewController : UITableViewController <UITableViewDataSource, UITableViewDelegate> {
id theDelegate;
}
- (id) initWithDelegate:(id)delegate;
@end
@protocol GTVC
@optional
- (UITableViewCell *) getDataForRow:(NSIndexPath *)path;
- (void) rowSelected:(NSIndexPath *) path;
@end
在 .m 文件中,此示例如下所示:
@implementation GenericTableViewController
- (id) initWithDelegate:(id)delegate {
self = [super initWithNibName:@"TableView.nib" bundle:nil];
if(self) {
theDelegate = [delegate retain]; //The 'retain' is optional, really.
}
return self;
}
- (void) dealloc {
[theDelegate release]; //In case of retain -> release.
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if([theDelegate respondsToSelector:@selector(getDataForRow:)])
return [theDelegate getDataForRow:indexPath];
else {
//Create general UITableViewCell
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if([theDelegate respondsToSelector:@selector(rowSelected:)])
[theDelegate rowSelected:indexPath];
else {
//Do stuff
}
}
@end
此协议/委托“游戏”可以轻松扩展,为您提供所需的所有级别的控制......一直使用 GenericTableViewController 作为“备份”,如果未设置任何委托或“未准备好”回答进一步指示的请求。我希望这有帮助。