我们使用 Xamarin 一段时间了,它在开发最新的 iPad 应用程序时导致了奇怪的崩溃。问题如下:
ipad 应用程序使用带有 2 个导航 Controller (例如 A 和 B)的 Storyboard,每个 Controller 都有一个 RootViewCOntroller(例如 A1 和 B1),其中 A 作为默认 NavController,并在 APP 启动时显示。 A1 上有 2 个按钮,按下按钮 1 会加载 NavController B。以下是单击 NavController A 上的按钮 1 时代码执行的步骤。
在按钮事件处理程序中,我调用 AppDelegate 中的公共(public)函数,该函数执行以下操作:
- 获取 StoryBoard iD 并使用 Storyboard.InstantiateViewCOntroller 实例化 NavController B。
- 从其 super View 中删除 NavCOntroller A(使用 UIView.View.RemoveSuperView())
- 将上述 B 引用分配给 appdelegate 窗口的 Root View Controller (它加载 NavCOntroller B 的 Root View Controller B1)。
在执行上述步骤之前一切正常(我可以在 iPad 上看到 rootviewcontroller 的 UiView 加载)。
下一步我尝试在实例化后推送另一个 UiViewController。(因为我的目标是 2 显示层次结构中的第二个屏幕)(storyboard.InstantiateViewController(标识符)。理想情况下,这应该向我显示推送的 View Controller 。但是执行此步骤后应用程序崩溃。!!奇怪!!!! 以下是简化的代码:
public void SetNavControllerB(UINavigationController navA, UiStoryBoard StoryBoard)
{
navA.View.RemoveFromSuperView();
this.Window.RootViewController = (UiNavigationController)StoryBoard.InstantiateViewController("VC0");
// 'VC0' is the identifier for NavigationController B with RootViewController as "VC1"
// It works great till the above step
UiViewController vc2 = (UiViewController)StoryBoard.InstantiateViewController("VC2");
((UINavigationController)this.Window.RootViewController).PushViewController(vc2, true);
//The above executes with out any exception, but it crashes later.
}
请帮忙!!!!!!
最佳答案
如果您要修改 UINavigationController
中的堆栈,而不是推送或弹出,那么您需要替换其整个 Controller 堆栈:
myNavController.SetViewControllers(new UIViewController[] { controller1, controller2 }, true);
如果您在上一次推送或弹出完成之前尝试推送或弹出,那么您将在控制台输出中收到崩溃和警告。
PS - 我认为您不需要在您的情况的任何地方调用 RemoveFromSuperview
,您应该只修改 UINavigationController 的
堆栈或替换 RootViewController
在您的窗口上。
关于ipad - 单点触控崩溃: Replace UINavigationController A with B and Push UiViewControllers on B,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14736055/