1

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

在此处输入图像描述

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

我尝试在 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

4 回答 4

1

我来到这个网站是因为我遇到了类似的问题。实际上我正在做同样的事情:我有一个带有两个子视图的视图控制器(都在一个有很多约束的情节提要中定义)。

在 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 的出口在情节提要中真正连接。)。

但真正的问题出现在正确的接线之后。如果你进入一个单元格,你可能想给 nextView 一些 cellID。当您手动定义了 tableviewcontroller 时,只有您的委托方法 didSelectRowAtIndexPath 被调用,而不是 prepareForSegue。

我玩过从情节提要中实例化视图控制器

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

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

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

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

于 2012-12-20T12:36:29.903 回答
0

使用您的 viewDidLoad 方法再试一次,这是最简单的答案。如果方法未加载,您可能必须查看方法中的其他内容,因为如果应用程序很大,因为他们经常使用情节提要,您可能有冲突的方法。

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

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

希望有帮助!

于 2012-07-08T15:09:57.140 回答
0

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

于 2012-08-13T05:14:49.667 回答
-1

在故事板中设置您的类和委托通常是最简单的(如包括这个在内的许多教程中所示)。

如果您真的想将滚动视图和表格视图放入同一个视图中,那么您需要研究一下UIViewController instantiateViewControllerWithIdentifier:,您可以合理轻松地拉出多个视图控制器(理想情况下,在情节提要中设置适当的类、委托和源) 并将他们的视图添加到您的外包装视图中。我会说我已经做到了这一点,你可以用它相当容易地做一些很酷的事情,但它通常不是最干净的做事方式。

于 2012-07-09T20:47:37.327 回答