我很难将数据传递到容器视图中的tableViewController,如下所示:
对于上下文,包含两个容器视图的View控制器本身就是tabViewController的第一个选项卡,它作为splitViewController的Detail View的主视图。
首先 - 我是否正确使用容器视图?第一个选项卡的目的是在顶部显示一些过滤器“设置”,这些设置可以通过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有效。选项卡1在运行时中断程序,由于'[containerViewController childViewControllers]'返回一个空数组而终止,因此对objectAtIndex:1的调用(我希望它会引用tableView)超出范围。我想知道在程序执行的这个时候容器视图是否未初始化?但我老实说不知道。
我认为我的查询与容器视图没有多大关系,更多地与层次结构遍历有关,所以尽管在容器视图的文档中寻找解决方案,但我真的没有找到太多帮助。
提前感谢您的任何提示!
答案 0 :(得分:1)
如果发现传递数据变得复杂,则创建一个所有视图控制器都可以访问的单个对象,并将其用作接收和销售数据对象的中介。您可以使用键/值或其他方案来执行此操作。
编辑:这很简单。定义一个类Foo,让类创建一个单例,并为任何类提供一种方法来获取它(Foo *foo = [Foo sharedFoo])
。向单例添加方法以支持setObject:forKey:
和objectForKey:
,就像NSMutableDictionary
或任何您想要的一样。如果你需要这个是线程安全的,那就更难但更相似 - 在这种情况下你需要使用一个串行调度队列来进行所有访问。上述每种技术都有很多关于SO的帖子(单例,串行调度队列线程等)。
现在你们所有的课程都可以包含Foo.h,访问单身人士,并提出要求或提供的东西。