如何在故事板中以编程方式为子视图设置视图控制器?

时间:2012-07-08 15:02:57

标签: ios uitableview xcode-storyboard

(在故事板中设计,截图如下)我在rootviewcontroller的视图中有两个子视图

enter image description here

在我的代码中,我想为每个子视图分配一个单独的视图控制器。即将tableViewController分配给TableView。

我尝试在awakeFromNib(或ViewDidLoad)方法中执行此操作,但无济于事。我的tableview控制器中的委托方法永远不会被调用。我认为,即使在我分配的tableviewcontroller可以做某事之前,storyboard也可以在这里加载子视图。

self.myTableViewController = (TodoListViewController *)[[UITableViewController alloc]  initWithStyle:UITableViewStylePlain];
self.myTableView.delegate = self.myTableViewController;
self.myTableView.dataSource = self.myTableViewController;
self.myTableViewController.tableView = self.myTableView;

我不确定在故事板中有这样的观点或者我做错了什么时候是否允许这样做?

4 个答案:

答案 0 :(得分:1)

我来到这个网站,因为我遇到了类似的问题。实际上我做的完全一样:我有一个带有两个子视图的viewcontroller(都在一个有很多约束的故事板中定义)。

在viewDidLoad中的containerviewcontroller中的

我正在做同样的调用(但我先定义了视图):

self.myTableViewController = (TodoListViewController *)[[UITableViewController alloc] initWithStyle:UITableViewStylePlain];
self.myTableViewController.tableView = self.myTableView;
self.myTableView.delegate = self.myTableViewController;
self.myTableView.dataSource = self.myTableViewController;

这对我有用(我猜,这是你的问题:你周围没有导航控制器......并确保你的桌面视图的插座真的在故事板中连接。)。

但真正的问题是在正确接线之后。如果您选中一个单元格,您可能想要将一些cellID提供给nextView。正如您手动定义了tableviewcontroller一样,只调用了您的委托方法didSelectRowAtIndexPath,而不是prepareForSegue。

我已经玩过了从故事板中实例化viewcontroller

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"aStoryboard" bundle:nil];
self.myTableViewController = [storyboard instantiateViewControllerWithIdentifier:@"myTableViewID"];

但是segue没有被调用。直接调用它(performSegueWithIdentifier:...)不起作用,因为这个tableviewcontroller不是由导航控制器管理的。

对我而言,最终会在containerViewController中调用prepareForSegue方法,该方法可以将调用委托给它的子视图控制器。

编辑:实际上真正的解决方案是DO NOT。有一个“容器视图”对象可以添加到视图中并定义视图控制器的一个区域,该区域可以包含子视图控制器。这就是我真正想做的事情。

答案 1 :(得分:0)

使用viewDidLoad方法再试一次,这是最简单的答案。如果方法没有加载,你可能需要查看你方法中的其他内容,因为如果应用程序很大,因为他们经常使用故事板,你可能会有相互冲突的方法。

我也会看这个: http://blog.waynehartman.com/archive/2012/01/07/uistoryboard-on-ios-5-the-good-the-bad-and-the.aspx

它显示了人们以编程方式使用任何故事板功能时最常见的事故

希望有所帮助!

答案 2 :(得分:0)

听起来你想自己写一个自定义容器控制器,例如类似于UISplitViewController。这是苹果关于UIViewController class reference中这样做的简要文档。例如,您可以在容器控制器的viewDidLoad:viewWillAppear:方法中以编程方式实例化子控制器。我认为你不能让IB为你实例化这些孩子,就像你可以将标签栏或导航控制器的关系连接到他们的孩子一样。 (如果有办法,我想知道!)

答案 3 :(得分:-1)

通常最简单的方法是在故事板中设置所有类和代理(如包括this one在内的众多摘要中所示)。

如果你真的想把滚动视图和表格视图放到同一个视图中,那么你需要查看UIViewController instantiateViewControllerWithIdentifier:,你可以合理地轻松地拉出多个视图控制器(理想情况下是适当的类) ,故事板中设置的委托和源代码,并将其视图添加到外部包装器视图中。我会说我已经完成了这个,你可以很容易地用它做很酷的事情,但它通常不是最干净的做事方式。