【发布时间】:2013-05-30 16:04:11
【问题描述】:
我需要帮助以编程方式遍历故事板层次结构。这张图片应该提供一些背景信息:storyboard。层次结构由一个 splitViewController 组成,其 master 是一个带有三个选项卡的 tabViewController。第一个选项卡包含两个容器视图,下面的视图是“问题子视图”。
我已成功遍历层次结构并将 masterViewController 作为选项卡 2 和 3 的委托分配给 detailViewController:
UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController;
UITabBarController *masterTabBarController = [[splitViewController viewControllers] objectAtIndex:0];
MasterViewController *masterViewController2 = [[masterTabBarController viewControllers] objectAtIndex:1];
MasterViewController *masterViewController3 = [[masterTabBarController viewControllers] objectAtIndex:2];
masterViewController2.delegate = detailTableViewController;
masterViewController3.delegate = detailTableViewController;
但是,由于容器视图,选项卡 1 更令人讨厌。我的尝试没有奏效,导致索引越界错误:
UIViewController *containerViewController = [[masterTabBarController viewControllers] objectAtIndex:0];
MasterViewController *masterViewController1 = [[containerViewController childViewControllers] objectAtIndex:1];
masterViewController1.delegate = detailTableViewController;
因此,除了 AppDelegate,我还在我的 MasterViewController 本身中尝试了另外两个路由:
- (void)viewDidLoad
{
self.delegate = (DetailTableViewController *)[[self.splitViewController.viewControllers lastObject] presentedViewController];
//self.delegate = [[self.parentViewController.parentViewController.parentViewController.childViewControllers objectAtIndex:1] objectAtIndex:0]; Granted this should ONLY work for tab 1...but it doesnt.
}
但未注释的行返回 nil...
所以我希望某个善良的灵魂能够理解容器视图(因为几乎找不到关于这些的细节)以及如何通过遍历或其他一些技术访问和分配委托给它们。必须有更好的方法——我这里有一个非常小的应用程序;我无法想象必须单独遍历具有数十个屏幕的复杂应用程序的层次结构。
提前致谢!!
【问题讨论】:
-
容器和子视图控制器没有什么黑魔法。如果孩子们正确链接到他们的父母,你的第一个解决方案对我来说看起来不错。由于
[containerViewController childViewControllers]中的对象少于 2 个,要么您的视图控制器层次结构设置不正确,要么containerViewController不是您认为的对象。在设置containerViewController的值之前,您能否展示更多代码如何遍历视图控制器层次结构? -
哇,我确实不小心遗漏了这行关键的代码[也将编辑问题]:
UIViewController *containerViewController = [[masterTabBarController viewControllers] objectAtIndex:0];这行是我之前发布的链接中唯一缺少的代码。当然,它旨在提供对包含两个容器视图的 UIView 的引用,下面的容器视图是一个值得关注的问题。因此,当我实例化 containerViewController 时,我希望调用[[containerViewController childViewControllers] objectAtIndex:1]会返回我需要的...
标签: ios delegates uisplitviewcontroller