2

我们使用 Xamarin 已经有一段时间了,它在开发最新的 iPad 应用程序时导致了奇怪的崩溃。以下是问题:

ipad 应用程序使用带有 2 个导航控制器(比如 A 和 B)的故事板,每个控制器都有一个 RootViewCONtroller(比如 A1 和 B1),其中 A 作为默认导航控制器,并在 APP 启动时显示。A1 上有 2 个按钮,按下按钮 1 加载 NavController B。以下是单击 NavController A 上的按钮 1 时代码执行的步骤。

在 Button Event handler 中,我在 AppDelegate 中调用了一个公共函数,该函数执行以下操作:

  • 获取 StoryBoard iD 并使用 storyboard.InstantiateViewCONtroller 实例化 NavController B。
  • 从其超级视图中删除 NavCONtroller A(使用 UIView.View.RemoveSuperView())
  • 将上述 B 的引用分配给 appdelegate 窗口的 Root 视图控制器(加载 NavCOntroller B 的 rootview 控制器 B1)。

在上述步骤之前它工作正常(我可以在 iPad 上看到 rootviewcontroller 的 UiView 负载)。

下一步我试图在实例化后推送另一个 UiViewController。(因为我的目标是 2 显示层次结构中的第二个屏幕)(storyboard.InstantiateViewController(identifier)。理想情况下,这应该向我显示推送的视图控制器。但是应用程序在之后崩溃这一步.!! WEIRD!!!!. 以下是简化代码:

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.
}

请帮帮忙!!!!!!

4

1 回答 1

2

如果您在UINavigationControllerpush 或 pop 之外修改堆栈,则需要替换其整个控制器堆栈:

myNavController.SetViewControllers(new UIViewController[] { controller1, controller2 }, true);

如果您在之前的 push 或 pop 完成之前尝试 push 或 pop,那么您将在控制台输出中收到崩溃和警告。

PS - 我认为你不需要RemoveFromSuperview在你的情况下调用任何地方,你应该修改UINavigationController's堆栈或替换RootViewController你的窗口。

于 2013-02-06T18:40:50.747 回答