0

我需要帮助以编程方式遍历故事板层次结构。这张图片应该给出一些背景信息: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 ...

所以我希望某种灵魂能够理解容器视图(因为几乎找不到关于这些的细节)以及如何通过遍历或其他技术访问和分配委托给它们。必须有更好的方法——我这里有一个非常小的应用程序;我无法想象必须单独遍历具有数十个屏幕的复杂应用程序的层次结构。

提前致谢!!

4

2 回答 2

0

我没有解决方案,但我写这个作为答案,因为它给了我更多的空间来阐述。

与您提供的故事板图像相比,您的代码似乎是正确的。不过,我不习惯故事板,我更喜欢以编程方式设置所有内容,所以我可能是错的。但是:我做了一个快速测试项目,试图复制你的故事板。然后我复制并粘贴您的代码以逐字检索masterViewController1到我的测试项目中,一切正常!

结论:故事板中的某些内容设置错误。或者您的代码中未在此处显示的某些内容会意外更改容器/子关系。

我的建议:检查你的故事板。如果您没有发现错误,请从头开始创建一个新的故事板,也许在一个单独的项目中。从简单开始并验证每个步骤。设置正确后,您可以将新故事板与旧故事板进行比较以找出错误。

我知道这是非常笼统的建议,但鉴于目前的情况,我不知道你还能做什么。祝你好运。

于 2013-05-31T22:41:55.020 回答
0

为了找到我的问题的解决方案,我尝试在一个全新的故事板中以较小的规模模仿我的问题,确保所有连接和代码都已正确设置。然后,当我设置容器视图时,我突然意识到:

在故事板中,容器视图被自动定义为“嵌入转场”,并且在技术上与它们所在的屏幕无关。因此,您不能简单地询问“父”视图的子视图并期望返回容器视图的数组。

因此,为了将数据传递到相关容器视图并为其定义委托,我为包含容器视图的视图创建了一个自定义类,并完全忽略了 AppDelegate。在这个类中,我定义了一个 prepareForSegue 函数:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    SingletonObject *data = [[SingletonObject alloc] init];

    if([segue.identifier isEqualToString:@"containerView1SegueID"])
    {

    }
    else if([segue.identifier isEqualToString:@"tableEmbedSegue"])
    {
        MasterViewController *masterViewController0 = segue.destinationViewController;

        [[segue destinationViewController] setDelegate:data.detailTableViewController];
        // ^ Or more specifically, 'masterViewController0.delegate = data.detailTableViewController;' would also work
    }
}

我希望这可以帮助任何在容器视图方面遇到问题的人。他们不是孩子!它们是嵌入序列。使用 prepareForSegue 你会很开心。

于 2013-06-04T20:24:28.357 回答