设置UITableView的子类作为其委托/ dataSource

时间:2012-08-19 18:16:11

标签: objective-c uitableview

我有一个子类UITableView,'subclassChild',它继承自另一个子类'subclassParent'。 'subclassParent'然后继承自UITableView

我的视图控制器继承自定义的视图控制器'GenericTableViewController',并包含我的UITableViewController,其类型为'subclassChild'。

'GenericTableViewController'为包含表视图的所有视图控制器自定义表格页眉和页脚。

我的问题是,如何使我的UITableView可以使用'subclassChild'和'subclassParent'作为其委托和dataSource。仍然确保'GenericTableViewController'自定义我的表格页眉和页脚。

对不起,如果这有点令人困惑,我试着尽可能地描述它。

P.S我在头文件中添加了<UITabBarDelegate, UITableViewDataSource>

我确保该表继承自IB中的'subclassChild'。

提前致谢!

1 个答案:

答案 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作为'备份',如果没有设置任何委托,或者'未准备好'回答进一步指示的要求。 我希望这会有所帮助。