从 AppDelegate 向 NavigationController 推送超过 3 ViewController 应用程序崩溃
Push more than 3 ViewController in NavigationController from AppDelegate App crash
我正在处理推送通知。现在,当应用程序被提升到设备时,当我点击它时。我想将 3 ViewController 推送到导航堆栈。
所以我使用下面的代码来做到这一点。
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);
}
上面的代码可以正常打开 Specific 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.
我的解决方案:
当我在 google 上搜索时,有人说从每个 ViewController ViewDidAppear
方法中一个接一个地打开 ViewController 但我不确定这是否正确方式。
感谢任何帮助。
您不能推送多个带有动画的视图控制器。如果您希望用户看到转换 A -> B -> C,您确实必须在 A 和 B 的 viewDidAppear 方法中执行此操作。
如果你想让用户只看到最后一个视图控制器 C 并且能够通过 A 和 B 返回,你可以一次推送它们,但是你需要在没有动画的情况下这样做:
nav.PushViewController(webController2, false);
另一种选择是像这样使用 SetViewControllers:
nav.SetViewControllers([A, B, C], true);
这将同时推送所有 3 个视图控制器,并且只有最顶层的视图控制器会使用推送转换进行动画处理。我认为这不符合您的情况,只是为了完整起见将其添加到此处。
我正在处理推送通知。现在,当应用程序被提升到设备时,当我点击它时。我想将 3 ViewController 推送到导航堆栈。
所以我使用下面的代码来做到这一点。
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);
}
上面的代码可以正常打开 Specific 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.
我的解决方案:
当我在 google 上搜索时,有人说从每个 ViewController ViewDidAppear
方法中一个接一个地打开 ViewController 但我不确定这是否正确方式。
感谢任何帮助。
您不能推送多个带有动画的视图控制器。如果您希望用户看到转换 A -> B -> C,您确实必须在 A 和 B 的 viewDidAppear 方法中执行此操作。
如果你想让用户只看到最后一个视图控制器 C 并且能够通过 A 和 B 返回,你可以一次推送它们,但是你需要在没有动画的情况下这样做:
nav.PushViewController(webController2, false);
另一种选择是像这样使用 SetViewControllers:
nav.SetViewControllers([A, B, C], true);
这将同时推送所有 3 个视图控制器,并且只有最顶层的视图控制器会使用推送转换进行动画处理。我认为这不符合您的情况,只是为了完整起见将其添加到此处。