【发布时间】:2014-02-20 23:53:14
【问题描述】:
我在视图控制器 (vc) 之间有一个复杂的流程。当我的主视图控制器显示时,它会检查用户是否登录,如果没有,它会在viewWillAppear 中推送一个登录 vc。登录然后可以推送注册vc。此外,在应用程序的第一次启动时,它还显示了一个特殊的 vc,也来自主 vc 的viewWillAppear(仅一次)。用户是否登录或跳过登录都没有关系。
该应用程序也可以通过自定义 URL 打开,这应该打开我的一个 vcs。应用程序必须在该屏幕上启动/恢复,而 vcs 之间没有任何可见的过渡。所有这些流程都是从我的主 vc 处理的,它在viewWillAppear 和didBecomeActive 中处理这个问题,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