【问题标题】:UINavigationController "forwarding" a pushViewControllerUINavigationController “转发”一个 pushViewController
【发布时间】:2012-11-05 16:42:21
【问题描述】:

我对 UINavigationControllers 有一个问题。我不知道如何表达我想要做的事情,所以我只是试一试。 :) 我有一个工作 UINavigationController 层次结构。它工作正常。

然而,我有一种情况,“推送”的 ViewController 类本身不显示任何内容,而是确定将推送“转发”到哪个子 ViewController。

MasterVC -> DeciderVC -> forwards to fooVC
or                    -> forwards to barVC

我想基本上将[self.navigationController pushViewController:DeciderVC animated:NO] 使用逻辑重定向到[self.navigationController pushViewController:fooVC animated:NO]barVC

我可以将它硬编码到 MasterVC 中,但关键是我想在不同的场景中重用 DeciderVC,同时保持 MasterVC、fooVC 和 barVC 不变。我如何才能最好地做到这一点?

谢谢

编辑: 关于工作流程的一个小说明: MasterVC 显示一些可能的功能集。 如果用户选择函数集 A,则调用 DeciderObjectA 并依次推送 fooVC,记录数据,然后推送 barVC,收集数据,然后再次推送 barVC 并收集数据。然后DeciderObjectA 处理该数据。 如果用户选择函数集 B,则调用DeciderObjectB 并依次推送barVC,然后是fooVC,然后处理数据。
DeciderObjects 对@protocolfooVCbarVC 中声明的相同委托方法的响应不同。

【问题讨论】:

    标签: ios ios5 uiviewcontroller uinavigationcontroller


    【解决方案1】:

    如果您的 DeciderViewController 没有显示任何内容,为什么它必须是 UIViewController?在我看来,一个简单的NSObject 检查策略并决定接下来要推送哪个控制器就足够了。用您的话来说,您在 MasterVC 中有决定推送哪一个的代码。 (我不明白在两者之间添加UIViewController 有什么好处。如果我遗漏了什么,请详细说明。)

    MasterVC -> fooVC 
    MasterVC -> barVC
    

    【讨论】:

    • 好点,我完全同意。所以我把决定者改成NSObject。我将 self.navigationController 从 MasterVC 传递给 Decider self.parentController(实例变量),这样我就可以访问全局导航控制器。然后我打电话给pushViewController:fooVC,它就可以工作了。我现在的问题是我在 fooVC 的 protocol 中定义了一个委托方法,并且它没有在 Decider 中被调用,即使它已实现。
    • 更具体地说,如果我从 fooVC 中向[self.delegate someMethod] 发送消息,我会收到unrecognized selector sent to instnance,尽管它是在 Decider.m 中实现的,并且我还在分配和初始化 fooVC 后设置了委托
    • 好的。我认为最好还是从 MasterVC 而不是 DeciderObject 推送 ViewController。 DeciderObject,无论是新类还是一些内联代码,都只是做出决定。推送 ViewController 应该在 ViewController 中执行。然后您也不必重置代表等。而且 self.delegate 不为零?
    • 我不能这样做,因为我有不同的 DeciderObjects,它们都以不同的顺序使用 fooVC 和 barVC,并以不同的方式处理在 fooVC 和 barVC 中收集的数据。 DeciderObject 不仅决定显示哪个 VC,还知道如何处理返回的数据。如果我将它全部放在 MasterVC 中,那么 a) 它不会工作,因为委托方法被调用相同,即使数据的使用方式不同,并且 b) MasterVC 会变得非常臃肿。创建后,我在 DeciderObject 中设置了fooVC.delegate = self
    • 好的,我明白了。我现在越来越难找到错误了;)。我会尝试对此有更多的想法。
    【解决方案2】:

    DeciderVC 可以简单地将所有内容转发到foobar 吗?你能不能简单地在viewDidLoad 中为Decider 实例化适当的一个并将它的view 分配给Decider 的视图?

    例如

    Decider.m
    - (void) viewDidLoad:(BOOL)animated {
    ...
    UIViewController *fooVC = [[FooVC alloc] init];
    [self.view addSubview:fooVC.view];
    ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2012-01-17
      • 2013-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多