我们已经使用Xamarin一段时间了,它在开发最新的iPad应用程序时引起了一个奇怪的崩溃。以下是问题:
ipad App使用带有2个导航控制器(比如A和B)的故事板,每个导航控制器都有一个RootViewCOntroller(比如A1和B1),A作为默认的NavController,并在APP启动时显示。 A1上有2个按钮,按下按钮1加载NavController B.这是当单击NavController A上的按钮时代码执行的步骤。
在Button事件处理程序中,我调用AppDelegate中的公共函数,它执行以下操作:
直到上面的步骤才能正常工作(我可以在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 !!!!!!
答案 0 :(得分:2)
如果要在推送或弹出之外的UINavigationController
中修改堆栈,则需要替换整个控制器堆栈:
myNavController.SetViewControllers(new UIViewController[] { controller1, controller2 }, true);
如果您在上一次推送或弹出窗口完成之前尝试推送或弹出,那么您将在控制台输出中收到崩溃和警告。
PS - 我认为您不应该在任何情况下拨打RemoveFromSuperview
,只需修改UINavigationController's
堆栈或替换窗口上的RootViewController
。