1

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

我的视图控制器继承自自定义视图控制器“GenericTableViewController”,并包含我UITableViewController的具有“subclassChild”类。

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

我的问题是,我该如何做UITableView才能使用 'subclassChild' 和 'subclassParent' 作为其委托和数据源。仍然确保“GenericTableViewController”自定义我的表格页眉和页脚。

抱歉,如果这有点令人困惑,我已尽力描述它。

PS 我已经<UITabBarDelegate, UITableViewDataSource>在头文件中添加了。

而且我已经确保该表继承自 IB 中的“subclassChild”。

提前致谢!

4

1 回答 1

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

于 2012-08-19T18:23:18.223 回答