2013-02-06 3 views
2

우리는 잠시 동안 자 마린을 사용하고 최신 아이 패드 응용 프로그램을 개발하면서 이상한 충돌의 원인에 UiViewControllers을 밀어 넣습니다. 다음은 문제입니다.Monotouch 충돌 : B와 UINavigationController가를 교체하고 B

ipad 앱은 A와 B가 기본 NavController로 RootViewCOntroller (예 : A1과 B1)가 있고 APP 시작시에 표시되는 2 개의 탐색 컨트롤러 (예 : A와 B)가있는 스토리 보드를 사용합니다. A1에 2 개의 버튼이 있습니다. 버튼 1을 누르면 NavController B가로드됩니다. NavController A의 버튼 하나를 클릭하면 코드가 실행되는 단계가 나타납니다.

  • 스토리 보드 ID를 얻고 storyboard.InstantiateViewCOntroller를 사용하여 NavController B의 인스턴스 : 버튼 이벤트 핸들러에서

    , 나는 다음을 수행 AppDelegate에있는 공용 함수를 호출합니다.
  • 는 수퍼에서 NavCOntroller 제거
  • (NavCOntroller B의 rootview 컨트롤러 B1로드)를 AppDelegate에 윈도우의 루트 뷰 제어기 B의 상기 레퍼런스를 지정 (UIView.View.RemoveSuperView()을 사용하여).

위의 단계까지 제대로 작동합니다 (iPad에서 rootviewcontroller의 UiView로드를 볼 수 있음).

다음 단계로 인스턴스화 한 후에 다른 UiViewController를 푸시하려고합니다. (내 대상이 2 번째 계층 구조를 보여주기 때문에) (storyboard.InstantiateViewController (identifier). 이건 내가 푸시 된 뷰 컨트롤러를 보여줘야합니다.하지만 .. 다음은 응용 프로그램이 단계 이후에 충돌! 이상 해요 !!!! 는 단순화 된 코드 :

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

요나단 주셔서 감사합니다 응답 만. 당신의 대답은 제가 좀 더 나아갈 수 있도록 도와주었습니다. I가 수정 한 다음 UINavigationController가 uiNav = storyBoard.InstantiateViewController ("VC0"); uiNav.SetViewControllers (새 UIViewController에 [{uiNav.ViewController [0] storyBoard.InstantiateviewController ("VC2")}에 해당); 놀랍게도 APP에서 충돌이없는 Nav Controller B의 두 번째 VC가 나타났습니다. 그러나 그것은 또 다른 문제를 제기 : –

+0

위의 설명을 계속 : VC2 다시 버튼을 누르면, 응용 프로그램 충돌. I 맞춤 오른쪽으로 스 와이프 SEGUE 구현 (('뒤로'버튼과 동일한 기능을 수행하는 팝의 ViewController)). 내가 오른쪽으로 문지를 때도 거기에서 부서집니다. 생선을 찾으셨습니까? 다시 감사합니다. –

답변

2

당신이 UINavigationController의 스택을 수정하는 경우 푸시 또는 팝을 넘어서면 전체 컨트롤러 스택을 교체해야합니다.

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

이전 푸시 또는 팝업 완료 전에 푸시 또는 팝업을 시도하면 콘솔 출력에 충돌 및 경고가 표시됩니다.

PS - 상황에 따라 RemoveFromSuperview 번으로 전화해야한다고 생각하지 않는다면, UINavigationController's 스택을 수정하거나 창에서 RootViewController을 바꿔야합니다.

+0

조나단, 귀하의 회신에 감사드립니다. 당신의 대답은 제가 좀 더 나아갈 수 있도록 도와주었습니다.I가 수정 한 다음 UINavigationController가 uiNav = storyBoard.InstantiateViewController ("VC0"); uiNav.SetViewControllers (새 UIViewController에 [{uiNav.ViewController [0] storyBoard.InstantiateviewController ("VC2")}에 해당); 놀랍게도 APP에서 충돌이없는 Nav Controller B의 두 번째 VC가 나타났습니다. 그러나 또 다른 문제가 발생했습니다 : –

+0

위의 설명을 계속 : VC2의 뒤로 버튼을 누르면 응용 프로그램이 충돌합니다. I 맞춤 오른쪽으로 스 와이프 SEGUE 구현 (('뒤로'버튼과 동일한 기능을 수행하는 팝의 ViewController)). 내가 오른쪽으로 문지를 때도 거기에서 부서집니다. 생선을 찾으셨습니까? 다시 감사합니다. –

+0

Jonathan : 나는 또한 myNSController.SetViewControllers (..., true)를 사용하여 NavStack의 viewcontrollers를 설정 한 후 마지막 viewcontroller가 app에 표시되도록했습니다 (예상대로). 하지만 상위 컨트롤러 아래의 viewcontroller의 viewdidload() 메소드는 호출되지 않았습니다. –