迭代“活动”视图控制器

Posted

技术标签:

【中文标题】迭代“活动”视图控制器【英文标题】:Iterating 'Active' View Controllers 【发布时间】:2010-04-10 22:24:39 【问题描述】:

奥拉乡亲们,

在 iPhone 应用程序中,我使用 addSubView:SomeViewController.view 方法显示不同的视图。

我希望至少能够记录正在显示的视图层次结构中的视图控制器。我希望能够获得特定视图控制器的句柄。

我知道如何迭代视图,只是不知道如何访问这些视图的视图控制器。我正在寻找可以让我访问 UINavigationController::ViewControllers 的视图控制器类型的东西。

我以为我可以逃脱:

for (UIViewController* oVC in [self.view subviews])

但这并没有达到预期的效果。

如果有人有办法做到这一点,请与我分享。

-isdi-

【问题讨论】:

就有用性而言,我想知道在一系列 AddSubview 调用之后堆栈上的视图控制器是什么。在这种特殊情况下,我想访问位于其他四个视图控制器下方的特定视图控制器。在我发布问题不到两分钟后,我很乐意向降级问题的人说明这一点。 【参考方案1】:

视图不保留对其视图控制器的引用(或者一般来说对视图控制器一无所知),因此您必须自己跟踪该映射。如果您将所有视图控制器保存在数组 viewControllers 中,您可以执行以下操作:

- (UIViewController *) viewControllerForView:(UIView *)view 
    for (UIViewController *viewController in viewControllers)
        if (viewController.view == view)
            return viewController;
    return nil;

【讨论】:

奥拉汤姆。当。我希望在尝试不同方法半天后情况并非如此。谢谢你的回答,我会在RootViewController中实现某种跟踪机制。【参考方案2】:

视图与拥有它的视图控制器交互的标准方式是将视图控制器设置为视图的委托或操作目标。该视图旨在不包含有关委托或操作目标的任何详细信息。

如果您已经实现了自己的视图,只需添加一个成员来保存对视图控制器的引用。或者为视图采用委托模型,以便委托是什么类无关紧要。

如果您将视图视为堆栈并希望在其旁边维护堆栈视图控制器,类似于 UINavigationController 为您所做的,您必须手动执行此操作。将 addSubview:viewController.view 的每次调用与对 [myViewControllerArray addObject:viewController] 的调用结合起来,并在视图从视图层次结构中移除时从数组中移除 viewController。

【讨论】:

你好 Drawnonward,我没想过将 ViewController 设置为委托。我喜欢这个主意。谢谢。如果我能给你点什么,我会的。

以上是关于迭代“活动”视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

为啥视图中的按钮与父视图控制器处于非活动状态?

如何确定当前视图控制器是不是处于活动状态,如果处于活动状态则执行代码

尝试与活动视图控制器共享文件中的 json 字符串

将现有和活动的手势识别器传递给模态视图控制器

如何将 BLE 活动继续到下一个视图控制器

在键盘处于活动状态时呈现模态视图控制器