视图控制器之间的iOS复杂导航

时间:2014-01-29 09:16:01

标签: ios cocoa-touch uiviewcontroller

我在视图控制器(vc)之间有一个复杂的流程。当我的主视图控制器显示时,它会检查用户是否已登录,如果没有,则会在viewWillAppear中按vc中的日志。登录然后可以推送寄存器vc。此外,在应用程序首次启动时,它还会显示一个特殊的vc,也来自主vc的viewWillAppear(仅一次)。用户是否已登录或跳过登录无关紧要。

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

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

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

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

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

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

编辑1:我的目标是iOS7及更新版本。

编辑2:这是显示我的问题的sample demo。我将链接指向了他的主vc,它在其viewWillAppear中推送其他vcs(其他vcs并不重要)。这只是为了表达目的。

此演示将日志显示到控制台“嵌套推送动画可能导致导航栏损坏”和“在意外状态下完成导航转换。导航栏子视图树可能已损坏。”哪个没出现在我的大项目中。我知道它们的意思,但是当antoher弹出时我怎么能推动vc?上面提到的BufferedNavigationController在iOS 7上不适用于我(这不是问题,它不使用ARC)。

编辑3 :当我第一次启动提供的演示时,它将打开登录屏幕而不是主屏幕。然后点击登录后返回主屏幕并立即按下另一个屏幕而不显示主屏幕。它没有这样做,主要是可见的,但导航栏认为主要部分之上有一些东西,因此可见的后退按钮。它腐蚀了后躯......

1 个答案:

答案 0 :(得分:0)

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

请参阅第一个场景,例如开放式登录或其他视图控制器。

对于自定义网址,您也可以使用相同的逻辑,并在从自定义网址到达时检查并显示。

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