【问题标题】:Assigning Delegation for a splitViewController where the masterController is housed in a Container View为 masterController 位于容器视图中的 splitViewController 分配委托
【发布时间】: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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 嘿 - 我只想说我感谢您的反馈,而且它很有帮助,herzbube。我将用我的最终发现来回答我自己的问题,同时也给我更多的空间来阐述。
  • @OneManBand 很高兴听到您找到了解决方案。继续编码:-)
【解决方案2】:

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

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

因此,为了将数据传递到相关容器视图并为相关容器视图定义委托,我为包含容器视图的视图创建了一个自定义类,并完全忽略了 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,你会很开心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2016-07-18
    • 2019-05-08
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多