0

我很难将数据传递给位于容器视图中的 tableViewController,如下所示:
在此处输入图像描述
对于上下文,包含两个容器视图的视图控制器本身就是 tabViewController 的第一个选项卡,它充当主视图splitViewController 的详细视图。

首先 - 我是否正确使用容器视图?第一个选项卡的目的是在顶部显示一些过滤器“设置”,这些设置可以通过 push segue 进行编辑(因此它是一个导航控制器),在底部,tableView 的数据将根据过滤器标准进行更新。使用两个容器视图来完成此功能似乎很直观,但我的经验很少,不知道是否有更好的方法,或者容器视图的实用程序是否比看起来更小众。

对于最初的问题 - 假设这个层次结构是有道理的,我很难将数据传递给这个特定的 tableViewController。tabViewController 中还有另外两个选项卡,它们都没有使用容器视图,因此我能够使用 appDelegate 成功遍历层次结构以在这些选项卡中显示数据,如下所示:

// Initial Setup
    UISplitViewController *splitViewController = (UISplitViewController *) self.window.rootViewController;
    UITabBarController *masterTabBarController = [[splitViewController viewControllers] objectAtIndex:0];

    // Tab 1: Filter by Location:
    // >>> **PROBLEM CODE SEGMENT** <<<
    UIViewController *containerViewController = [[masterTabBarController viewControllers] objectAtIndex:0];
    MasterViewController *masterViewController0 = [[containerViewController childViewControllers] objectAtIndex:1];
    masterViewController0.slotMachines = machines;

    // Tab 2: Filter by ID#:
    MasterViewController *masterViewController1 = [[masterTabBarController viewControllers] objectAtIndex:1];
    masterViewController1.slotMachines = machines;

    // Tab 3: Audited
    MasterViewController *masterViewController2 = [[masterTabBarController viewControllers] objectAtIndex:2];
    masterViewController2.slotMachines = machines;

我跳过了通过委托将数据分配给每个 masterViewController0/1/2 的代码片段。如前所述,选项卡 2 和 3 有效。Tab 1 在运行时中断了程序,由于“[containerViewController childViewControllers]”返回一个空数组而终止,因此对 objectAtIndex:1 的调用(我希望它引用 tableView)超出了范围。我想知道在程序执行的这一点上是否没有初始化容器视图?但老实说,我不知道。

我认为我的查询与容器视图的关系不大,而与层次遍历有关,因此尽管在有关容器视图的文档中查看了解决方案,但我确实没有找到太多帮助。

提前感谢您的任何提示!

4

1 回答 1

1

如果您发现传递数据变得越来越复杂,那么创建一些所有视图控制器都可以访问的单例对象,并将其用作接收和发送数据对象的中介。您可以使用键/值或其他方案来执行此操作。

编辑:这真的很简单。定义一个类 Foo,并让该类创建一个单例,并为任何类提供一种获取它的方法(Foo *foo = [Foo sharedFoo])。向单例添加方法以支持setObject:forKey:objectForKey:喜欢NSMutableDictionary,或任何您想要的。如果您需要它是线程安全的,那么它更难但类似 - 在这种情况下,您需要使用串行调度队列进行所有访问。上述每种技术都有很多关于 SO 的帖子(单例、串行调度队列线程等)。

现在你所有的类都可以在其中包含 Foo.h,访问单例,并要求它提供东西或提供东西。

于 2013-05-28T16:36:47.977 回答