从 AppDelegate 应用崩溃时,在 NavigationController 中推送超过 3 个 ViewController

Posted

技术标签:

【中文标题】从 AppDelegate 应用崩溃时,在 NavigationController 中推送超过 3 个 ViewController【英文标题】:Push more than 3 ViewController in NavigationController from AppDelegate App crash 【发布时间】:2017-07-26 10:20:53 【问题描述】:

我正在处理推送通知。现在当应用程序被提升到设备并且当我点击它时。我想将 3 ViewController 推送到 Navigation Stack。

所以我使用下面的代码来做到这一点。

AppDelegate.cs 代码

Window = new UIWindow(UIScreen.MainScreen.Bounds);
Menu = new SlideoutNavigationController();

var storyboard = UIStoryboard.FromName("Main", null);
var webController = storyboard.InstantiateViewController("DashBoardViewController") as DashBoardViewController;

Menu.MainViewController = new MainNavigationController(webController, Menu);
Menu.MenuViewController = new MenuNavigationController(new DummyControllerLeft(), Menu)  NavigationBarHidden = false ;

Window.RootViewController = Menu;
Window.MakeKeyAndVisible();

var storyboarddd = UIStoryboard.FromName("Main", null);
var webControllerdd = storyboarddd.InstantiateViewController("DashBoardViewController") as DashBoardViewController;
webControllerdd.reloadNotication();

UINavigationController nav = webController.NavigationController;
var notifyWebController = storyboard.InstantiateViewController("NotificationListViewController") as NotificationListViewController;
notifyWebController.navigationContoller = nav;
nav.PushViewController(notifyWebController, true);

if (type.Equals("Damage Report"))

    var webController2 = storyboard.InstantiateViewController("DamageReportViewController") as DamageReportViewController;
    webController2.DamageReportId = id;
    webController2.navigationContoller = nav;
    nav.PushViewController(webController2, true);

if (type.Equals("Overloss"))

    var webController2 = storyboard.InstantiateViewController("OverlossViewController") as OverlossViewController;
    webController2.PacketId = id;
    webController2.navigationContoller = nav;
    nav.PushViewController(webController2, true);

上面的代码可以正常打开特定的 ViewController。

但我的应用程序在崩溃日志之后崩溃了。

崩溃报告:

2017-07-26 15:25:18.330 Aastha.ios[6357:2021514] nested push animation can result in corrupted navigation bar
2017-07-26 15:25:18.740 Aastha.iOS[6357:2021514] Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.

我的解决方案:

当我在谷歌上搜索时,有人说从每个 ViewController ViewDidAppear 方法中依次打开 ViewController 但我不确定这是否正确。

感谢任何帮助。

【问题讨论】:

尝试在某种延迟后推送所有控制器。它可能不会使应用程序崩溃。 发布了答案但将其删除(没有注意到它是针对 xamarin 的)。话虽如此...UINavigationController 包括一个将多个控制器建立为子控制器的方法(func setViewControllers(_ viewControllers: [UIViewController], animated: Bool))。我对 xamarin 一无所知,但也许该方法也在那里桥接(?) 刚刚检查了 Xamarin 的文档...方法 exists for sure。所以你需要类似nav.SetViewControllers([controllers], true) @Alladinian check Lope answer if I push Viewcontroller without Animation is open All Viewcontroller but after that it crash without crash log. @Ironman 对不起,但我不明白......洛佩的回答使用了完全不同的方法......如果你想将多个子控制器添加到你的导航堆栈SetViewControllers 是要走的路... 【参考方案1】:

您不能推送多个带有动画的视图控制器。如果您希望用户看到转换 A -> B -> C,您确实必须在 A 和 B 的 viewDidAppear 方法中进行。

如果您希望用户只看到最后一个视图控制器 C 并且能够返回通过 A 和 B,您可以一次全部推送它们,但您需要在没有动画的情况下这样做:

nav.PushViewController(webController2, false);

另一种选择是像这样使用 SetViewControllers:

nav.SetViewControllers([A, B, C], true);

这将同时推送所有 3 个视图控制器,并且只有最上面的一个将使用推送转换进行动画处理。我认为这不适合您的情况,只是为了完整起见将其添加到此处。

【讨论】:

好吧,我试试你的解决方案。 打开所有 ViewController 没问题,但现在它也崩溃了,没有崩溃报告。 如果即使没有动画也崩溃了,问题可能出在其他地方。您仍然收到控制台警告吗? 否 现在警告消失了,但应用程序仍然崩溃。 对不起,我不能再帮你了。我不知道 xamarin 提供了哪些调试选项

以上是关于从 AppDelegate 应用崩溃时,在 NavigationController 中推送超过 3 个 ViewController的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 应用程序在尝试访问 appDelegate 成员时崩溃

Firebase 应用程序在从后台激活时在启动时崩溃

当 testes 函数调用 AppDelegate + managed Object 时单元测试崩溃

在 iOS 9.1/9.2 上使用 EXC_BAD_ACCESS CODE 1 的 AppDelegate 类声明应用程序崩溃

当应用程序在后台并接收推送通知点击应用程序崩溃时

同时调用多个 ViewController 实例会导致应用在 AppDelegate 中崩溃