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

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

在此处输入图像描述

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

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

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

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

因为我有类似的问题,我来到这个网站。 实际上我正在做同样的事情:我有一个带有两个子视图的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; 

这对我有用(我猜,这是你的问题:你周围没有导航控制器……并确保你的tableview的sockets真的连接在故事板中。)。

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

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

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

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

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

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

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

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

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

希望有所帮助!

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

通常最简单的方法是在故事板中设置所有类和委托(如包括这一个在内的众多课程中所示)。

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