编辑
这个答案已经过时了。将视图控制器的视图添加为另一个视图控制器的子视图的正确方法是实现容器视图控制器。
https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html
原始答案
你的模式有点不同寻常。执行您所描述的操作的最常见方法是初始化并呈现 SecondViewController。如果这确实是您想要的,我强烈建议您仔细阅读 Apple 的文档,了解如何创建、自定义和呈现UIViewController
和UITableViewController
.
如果您知道所有这些并且真的想做一些自定义的事情,那么请继续阅读。
相反,您正在创建 SecondViewController 的实例,而不是呈现它,而是将其视图添加到当前视图控制器视图中。如果你知道你想要完成什么,而这实际上是你想要的结果,那就去做吧。
配置这种通用模式的方法不止一种。在此示例中,我将坚持使用最简单的方法。
1)MainViewController
(MVC)应该在SecondViewController
需要时将(SVC)实例保留在属性中。
2) SVC 是UITableViewController
so 默认的子类,它被设置为dataSource
and delegate
for it's UITableView
。这意味着您需要为要填充数据的表实现UITableViewDataSource
和UITableViewDelegate
方法。SVC
假设MVC
知道需要将哪些数据放入表中,它应该将其传递给SVC
. 最简单的方法是定义一个SVC
可以MVC
在初始化时设置的属性。
3)假设有一种方法可以在表格呈现后将其关闭,您会想MVC
要这样做。基本上,MVC
会从它的超级视图中删除SVC
的视图,然后将SVC
属性设置为 nil。
这是一些快速的伪代码。我写了最低限度的例子。
// MainViewController.h
//
#import "SecondViewController.h"
@interface MainViewController : UIViewController
@property (nonatomic, strong) SecondViewController *svc;
@end
// MainViewController.m
//
#import "MainViewController.h"
@implementation MainViewController
// init and configure views w/ init, loadView, viewDidLoad, etc
// present SecondViewController
- (void)presentSecondViewController:(id)sender {
self.svc = [[SecondViewController alloc] init];
// this example uses an array as the SVC data
self.svc.tableData = @[@"first", @"second", @"third", @"fourth"];
self.svc.view.frame = self.view.bounds;
[self.view addSubview:self.svc.view];
}
// dismiss SecondViewController
- (void)dismissSecondViewController:(id)sender {
if (self.svc) {
[self.svc.view removeFromSuperview];
self.svc = nil;
}
}
// SecondViewController.h
//
@interface SecondViewController : UITableViewController
@property (nonatomic, strong) NSArray *tableData;
@end
// SecondViewController.m
//
@implementation SecondViewController
// init and configure views w/ init, loadView, viewDidLoad, etc
// override tableData getter to create empty array if nil
- (NSArray *)tableData
{
if (!tableData) {
_tableData = @[];
}
return _tableData;
}
// override tableData setter to reload tableView
- (void)setTableData:(NSArray *)tableData
{
_tableData = tableData;
[self.tableView reloadData];
}
// implement UITableViewDelegate and UITableViewDataSource methods using
// the self.tableData array