在单独的表委托上使用pushViewController

时间:2012-03-04 21:22:44

标签: objective-c cocoa-touch pushviewcontroller

PrimaryViewController.h 中我有一个IBOutlet附加到我在.xib文件中添加的表

IBOutlet UITableView *table;
在PrimaryViewController.m中的

我从TableDataController类构造一个新的tableController并将其附加到表

tableController = [[TableDataController alloc] initWithStyle:UITableViewStylePlain];
//Attach the table controller as datasource and delegate to the table
[table setDelegate:tableController];
[table setDataSource:tableController];

现在表中的所有数据都来自tableController。因为PrimaryViewController是被推送到navigationController的堆栈而不是TableDataController类的类;使用:

[self.navigationController pushViewController:newViewController];
tableController 中的

没有任何结果,因为 tableController 没有 navigationController PrimaryViewController 可以使用 navigationController

我希望能够使用TableDataController中的函数didSelectRowAtIndexPath:将新的视图控制器推送到PrimaryViewController的堆栈上。

请注意:我不能#import "ParimaryViewController.h" 在我的TableDataController.h中,我可以发送它的( PrimaryViewController )对象 - 然后它们将相互交叉导入,从而产生语义错误。

PrimaryViewController是一个常规类,它扩展了UIViewController类,其中.xib没什么特别之处。 TableDataController是一个常规类,它使用 no .xib文件扩展UITableViewController类。

1 个答案:

答案 0 :(得分:0)

您可以将PrimaryViewController标头导入TableDataController。 m 以避免导入周期。

您的TableDataController只需要引用PrimaryViewController。您所要做的就是向TableDataController添加属性,并在创建数据控制器后立即设置。

@property (assign, nonatomic) PrimaryViewController * viewController;

为了能够使用该类名,您需要在TableDataController.h中的导入下方添加一个前向声明:

@class PrimaryViewController;

这让编译器知道有这样一个类,你将在这个头文件中引用它,但它将在别处定义。

照常合成属性。创建TableDataController时,将该属性设置为指向创建视图控制器:

tableController = [[TableDataController alloc] initWithStyle:UITableViewStylePlain];
[tableController setViewController:self];

现在,您可以通过访问该属性在TableDataController的方法中向视图控制器发送消息:

[self.viewController pushViewController:newViewController];