为splitConController分配委托,其中masterController位于Container View中

时间:2013-05-30 16:04:12

标签: ios delegates uisplitviewcontroller

我需要以编程方式遍历故事板层次结构的帮助。这张图片应该提供一些背景信息:storyboard。层次结构由一个splitViewController组成,其master是一个带有三个选项卡的tabViewController。第一个标签包含两个容器视图,下方视图是“问题儿童”。

我已成功遍历层次结构并将detailViewController指定给detailViewController作为选项卡2和3的委托:

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;

因此,我在MasterViewController中尝试了另外两条路径,而不是AppDelegate:

- (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 ...

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

提前致谢!!

2 个答案:

答案 0 :(得分:0)

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

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

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

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

我知道这是极端的一般性建议,但鉴于目前的情况,我不知道你还能做些什么。祝你好运。

答案 1 :(得分:0)

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

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

因此,为了将数据传入和定义相关容器视图的委托,我为容纳容器视图的视图创建了一个自定义类,并完全忽略了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
    }
}

我希望这可以帮助任何遇到容器视图问题的人。他们不是孩子!它们嵌入了segues。使用prepareForSegue,你会很高兴。