【问题标题】:iOS complex navigation between view controllers视图控制器之间的 iOS 复杂导航
【发布时间】:2014-02-20 23:53:14
【问题描述】:

我在视图控制器 (vc) 之间有一个复杂的流程。当我的主视图控制器显示时,它会检查用户是否登录,如果没有,它会在viewWillAppear 中推送一个登录 vc。登录然后可以推送注册vc。此外,在应用程序的第一次启动时,它还显示了一个特殊的 vc,也来自主 vc 的viewWillAppear(仅一次)。用户是否登录或跳过登录都没有关系。

该应用程序也可以通过自定义 URL 打开,这应该打开我的一个 vcs。应用程序必须在该屏幕上启动/恢复,而 vcs 之间没有任何可见的过渡。所有这些流程都是从我的主 vc 处理的,它在viewWillAppeardidBecomeActive 中处理这个问题,didBecomeActive 是应用程序的UIApplicationDidBecomeActiveNotification 的观察者。其中一些自定义 URL 必须先打开登录屏幕。

我天真的方法是在我的主 vc 的 viewWillAppear 中处理所有这些逻辑,我在其中根据当前状态推送 vcs。这适用于在应用程序启动时推送登录屏幕而没有任何问题。问题是当我从登录返回时,我需要推送另一个 vc。主导航控制器知道有东西被按下(后退按钮变得可见),但旧的 vc 是可见的(主),视图部分损坏,并且对触摸事件没有反应。点击后退按钮会使我的应用程序变得一团糟。

我用谷歌搜索,问题似乎是我们无法在另一个 vc 弹出时推送。我找到了一个BufferedNavigationController,它解决了这个问题,但它在iOS7下还不能正常工作。我什至没有在设备的控制台中看到任何日志。

另一个问题是,当应用程序在后台时,内存警告可能会弄乱我的 vc,并且应用程序的启动与从后台正常恢复完全不同。

目前我有一个快速的技巧,我为所有情况创建了一个自定义的后台堆栈,并将其设置为导航控制器的后台堆栈,并将最后一个 vc 推到该堆栈的顶部。然后在登录/注册屏幕中,如果用户跳过登录/注册过程,我会修改后台堆栈。这是一个丑陋的黑客,不是一个面向未来的解决方案。我想在一个地方集中控制 vcs 的推送,在这种情况下它们之间不能有任何可见的过渡。

有没有更好/更强大的解决方案来实现这一目标?从一个 vc(这是动画的)返回时,我无法看到可见的过渡,并且它下面的 vc 应该在它变得可见时将另一个推到它上面(没有此推送的动画)。所以看起来我们回到了一个完全不同的屏幕?不管它是否会让用户感到困惑,那是另一个问题。

编辑 1:我只针对 iOS7 和更高版本。

编辑 2: 这是一个 sample demo,它显示了我的问题。我将链接指向他的主 vc,它将其他 vc 推送到其 viewWillAppear 中(其他 vc 不重要)。仅用于演示目的。

此演示显示控制台“嵌套推送动画可能导致导航栏损坏”和“在意外状态下完成导航转换。导航栏子视图树可能损坏”的日志。在我的大项目中没有出现。我知道他们的意思,但是当另一个人突然消失时,我怎么能推动一个 vc 呢?提到的 BufferedNavigationController 在 iOS 7 上对我不起作用(这不是问题,它不使用 ARC)。

编辑 3:当我第一次启动提供的演示时,它将打开登录屏幕而不是主屏幕 - 很好。然后在点击登录后,它会返回主屏幕,并且应该立即推送另一个屏幕,而不会看到主屏幕。它不这样做,主是可见的,但导航栏认为主上方有东西,因此可见后退按钮。它破坏了后台堆栈...

【问题讨论】:

  • 我无法解决这个问题,但github.com/vasanth3008/NavigaitonDemo.git 这个方法可能对你有帮助
  • 第一次启动演示时,它会打开登录屏幕而不是主屏幕 - 很好。然后在点击登录后,它会返回主屏幕,并且应该立即推送另一个屏幕,而不会看到主屏幕。它不这样做,主是可见的,但导航栏认为主上方有东西,因此可见后退按钮。它破坏了后台堆栈。您的解决方案禁用推送另一个屏幕,这不是我需要的......
  • 这有什么问题
  • 是的。从登录返回后,我需要推动另一个屏幕。这就是我问题的重点。这不仅仅是另一个屏幕,当我返回主屏幕时,我需要快速推动多个屏幕。

标签: ios cocoa-touch uiviewcontroller


【解决方案1】:

https://stackoverflow.com/a/20947860/1405008

请参阅此作为您的第一个场景,例如打开登录或其他视图控制器。

对于自定义 URL,您也可以使用相同的逻辑并在其从自定义 URL 到达时检查并呈现。

始终设置根视图控制器将是在您的应用程序中执行此类不同导航内容的最简单方法,而且这种方法可以避免堆栈中不需要的视图控制器。

【讨论】:

  • didFinishLaunchingWithOptions 在应用从后台恢复时不会被调用。它仅在应用程序被杀死/尚未启动时调用。我的根视图控制器始终是一个导航 vc,它设置在情节提要中。然后在我的应用程序中,我使用 segues 或手动推送 vcs。当另一个 vc 弹出时,它仍然不能解决推送一个 vc 的问题。
  • 为什么你想在推的时候弹出
  • 我想要相反的,一边弹出一边推。我的主vc需要在从特定vc返回时推送另一个vc,没有过渡,在mian vc变得可见之前,这就是我使用viewWillAppear的原因所以看起来顶部的vc返回到了不同的屏幕。
  • - (void)applicationWillEnterForeground:(UIApplication *)application,使用该方法改变viewController层次
  • 当我在我的应用程序中推送和弹出视图控制器时是否调用了该方法?不是只有整个应用进入前台才调用吗?
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2014-10-10
  • 2014-04-10
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多