2013-02-06 38 views
2

我們已經使用Xamarin一段時間了,它在開發最新的iPad應用程序時導致了一次奇怪的崩潰。以下是問題:Monotouch崩潰:用B替換UINavigationController A並在B上推UiViewControllers

ipad應用程序使用故事板與2導航控制器(說A和B)每個都有一個RootViewCOntroller(說A1和B1),與A作爲默認NavController,並顯示在APP啓動。 A1上有2個按鈕,按下按鈕1加載NavController B.這裏是單擊NavController A上的按鈕1時代碼執行的步驟。

在按鈕事件處理函數,我調用AppDelegate的公共功能,執行以下操作:

  • 獲取故事板ID和使用storyboard.InstantiateViewCOntroller實例化NavController B中。
  • 從它的父卸下NavCOntroller A(使用UIView.View.RemoveSuperView())
  • 分配B與的appdelegate窗口的根視圖控制器以上參考(它加載NavCOntroller B的rootview控制器B1)。

它工作正常,直到上述步驟(我可以看到rootviewcontroller的UiView加載在iPad上)。 (因爲我的目標是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幫助!!!!!!

+0

Jonathan,感謝您的回覆。你的回答幫助我進一步移動。我修改爲以下內容: UINavigationController uiNav = storyBoard.InstantiateViewController(「vc0」); uiNav.SetViewControllers(new UiViewController [] {uiNav.ViewController [0],storyBoard.InstantiateviewController(「vc2」)},true); 令人驚訝的是APP顯示Navcontroller B的第二個VC,沒有任何崩潰。然而它引發了另一個問題: –

+0

繼續上面的評論: 當按下VC2上的後退按鈕時,應用程序崩潰。 我已經實現了一個自定義的swipe right segue(執行與'back'按鈕相同的功能(彈出viewcontroller))。當我向右滑動時,它也在那裏崩潰。 你有沒有發現任何可疑?再次感謝你。 –

回答

2

如果您在UINavigationController修改堆棧除了推動或流行音樂之外,您需要更換其整個控制器堆棧:

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

如果在上一次按下或彈出完成之前嘗試按下或彈出,則會在控制檯輸出中出現崩潰和警告。

PS - 我認爲您不需要在任何地方撥打RemoveFromSuperview,您應該修改UINavigationController's堆棧或在您的窗口中替換RootViewController

+0

Jonathan,感謝您的回覆。你的回答幫助我進一步移動。我修改爲以下內容: UINavigationController uiNav = storyBoard.InstantiateViewController(「vc0」); uiNav.SetViewControllers(new UiViewController [] {uiNav.ViewController [0],storyBoard.InstantiateviewController(「vc2」)},true); 令人驚訝的是APP顯示Navcontroller B的第二個VC,沒有任何崩潰。然而它引發了另一個問題: –

+0

繼續上面的評論: 當按下VC2上的返回按鈕時,應用程序崩潰。 我已經實現了一個自定義的swipe right segue(執行與'back'按鈕相同的功能(彈出viewcontroller))。當我向右滑動時,它也在那裏崩潰。 你有沒有發現任何可疑?再次感謝你。 –

+0

Jonathan:我還發現,在使用myNavController.SetViewControllers(...,true)在NavStack上設置viewcontrollers後,它使最後一個viewcontroller顯示在app上(如預期的那樣);但頂級控制器下的viewcontroller的viewwidload()方法沒有被調用。 –

相關問題