Monotouch崩溃:用B替换UINavigationController A并在B上替换UiViewControllers

时间:2013-02-06 18:19:41

标签: ipad uinavigationcontroller xamarin.ios uistoryboard

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

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

在Button事件处理程序中,我调用AppDelegate中的公共函数,它执行以下操作:

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

直到上面的步骤才能正常工作(我可以在iPad上看到rootviewcontroller的UiView加载)。

下一步我试图在实例化后推送另一个UiViewController。(因为我的目标是2显示层次结构中的第二个屏幕)(storyboard.InstantiateViewController(标识符)。这应该理想地显示推送的视图控制器。但是应用程序在此步骤后崩溃。!! 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.
}

Pleaseeeee help !!!!!!

1 个答案:

答案 0 :(得分:2)

如果要在推送或弹出之外的UINavigationController中修改堆栈,则需要替换整个控制器堆栈:

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

如果您在上一次推送或弹出窗口完成之前尝试推送或弹出,那么您将在控制台输出中收到崩溃和警告。

PS - 我认为您不应该在任何情况下拨打RemoveFromSuperview,只需修改UINavigationController's堆栈或替换窗口上的RootViewController