我有一个子类UITableView,'subclassChild',它继承自另一个子类'subclassParent'。 'subclassParent'然后继承自UITableView
。
我的视图控制器继承自定义的视图控制器'GenericTableViewController',并包含我的UITableViewController
,其类型为'subclassChild'。
'GenericTableViewController'为包含表视图的所有视图控制器自定义表格页眉和页脚。
我的问题是,如何使我的UITableView
可以使用'subclassChild'和'subclassParent'作为其委托和dataSource。仍然确保'GenericTableViewController'自定义我的表格页眉和页脚。
对不起,如果这有点令人困惑,我试着尽可能地描述它。
P.S我在头文件中添加了<UITabBarDelegate, UITableViewDataSource>
。
我确保该表继承自IB中的'subclassChild'。
提前致谢!
答案 0 :(得分:2)
你可以做的是,你的'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 - &gt;代表 - &gt; GenericTableViewController&lt; - DataSource / Delegate&lt; - 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作为'备份',如果没有设置任何委托,或者'未准备好'回答进一步指示的要求。 我希望这会有所帮助。