2012-04-15 3 views
1

UITabBarController은 5 UINavigationControllers입니다 (N1 - N5라고 부름). UINavigationControllers에는 UITableViewController가 네비게이션 스택에 푸시되도록 UI 요소가 있습니다.이 두 가지를 구현하려면 MonoTouch.DialogDialogViewController을 사용합니다. UITableViewControllers). T1 ~ T5라고 부르 자.ViewDid 뒤로 탐색 할 때 UINavigationController에 호출되지 않을 때

탭 사이를 탐색 할 때 각각 N1 - N5에서 예상대로 ViewDidAppear 메서드가 호출됩니다. 하지만 N1의 UI 요소를 터치하면 T1이 탐색 스택에 푸시되고 다시 버튼을 사용하여 되돌아 가려고하면 N1의 ViewDidAppear 메서드가 호출되지 않습니다.

재미있는 점은 다른 탭 (예 : N2)으로 탭 오버 한 다음 N1에 "탭 백"하면 ViewDidAppear이 정상적으로 호출된다는 것입니다. 그리고 만약에 T1이 nav 스택에 푸쉬되었다고해도, 같은 탭핑을하면 N1의 ViewDidAppear이 여전히 호출됩니다.

N1의 MonoTouch 코드는 다음과 같습니다 : 나는 무슨 일이 있었는지 알아 냈

public class CalendarPage : UINavigationController 
{ 
    private DialogViewController dvc; 

    public override void ViewDidAppear (bool animated) 
    {   
     // initialize controls 
     var now = DateTime.Today; 
     var root = new RootElement("Calendar") 
     { 
      from it in App.ViewModel.Items 
       where it.Due != null && it.Due >= now 
       orderby it.Due ascending 
       group it by it.Due into g 
       select new Section (((DateTime) g.Key).ToString("d")) 
       { 
        from hs in g 
         select (Element) new StringElement (((DateTime) hs.Due).ToString("d"), 
          delegate 
          { 
           ItemPage itemPage = new ItemPage(this, hs); 
           itemPage.PushViewController(); 
          }) 
         { 
          Value = hs.Name 
         }              
       } 
     }; 

     if (dvc == null) 
     { 
      // create and push the dialog view onto the nav stack 
      dvc = new DialogViewController(UITableViewStyle.Plain, root); 
      dvc.NavigationItem.HidesBackButton = true; 
      dvc.Title = NSBundle.MainBundle.LocalizedString ("Calendar", "Calendar"); 
      this.PushViewController(dvc, false); 
     } 
     else 
     { 
      // refresh the dialog view controller with the new root 
      var oldroot = dvc.Root; 
      dvc.Root = root; 
      oldroot.Dispose(); 
      dvc.ReloadData(); 
     } 
     base.ViewDidAppear (animated); 
    } 
} 

답변

1

. 내측 DialogViewController (ItemPage에서 생성됨)에서 뒤로 버튼을 누르면 바깥 쪽 DialogViewController (위의 "T1")이 UINavigationController ("N1")이 아닌 첫 번째 응답자가됩니다. 내 혼란은 내가 그 DialogViewController에있는 뒤로 버튼을 끈 사실로 인해 나는 DialogViewController (T1)에있는 동안 UINavigationController (N1)까지 줄곧 튀어 나온 것으로 가정했다.

은 내가 터지는하고 있는지 여부 (이 경우 ItemPage) 내부 DialogViewControllerViewDissapearing 이벤트를 생성하고 확인하여 원하는 동작을 ("T1"의 내용을 새로 고침) 구현 - 호출, 그렇다면 부모 컨트롤러의 ViewDidAppear 방법.

 actionsViewController.ViewDissapearing += (sender, e) => 
     { 
      if (actionsViewController.IsMovingFromParentViewController) 
       controller.ViewDidAppear(false); 
     }; 

참고이 코드에 대한 재미있는 것은 (당신이 다시 탐색 할 때 설정 될 것이라고 생각했던 것과 직관적 인) 실제로 작동하는 속성이 IsMovingFromParentViewController, NOT IsMovingToParentViewController 것입니다. 나는 이것이 MT.Dialog의 버그일지도 모른다고 생각하지만, 다시 컴팩트하게 해결할 수는 없다.

누군가가 도움이되기를 바랍니다.

관련 문제