2012-04-15 4 views
1

私はUITabBarControllerに5 UINavigationControllersというホストを持っています(N1〜N5と呼ぶ)。 UINavigationControllersのそれぞれには、UITableViewControllerをナビゲーションスタックにプッシュするUI要素があります(私はこれらを実装するためにMonoTouch.DialogDialogViewControllerを使用します)UITableViewControllers。 T1〜T5と呼んでみましょう。ViewDid UINavigationControllerの上にナビゲートすると呼び出されない場合

タブ間をナビゲートすると、メソッドがN1 - N5のそれぞれで期待通りに呼び出されます。しかし、例えば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)まで飛んでいったと仮定していました。

私はインナーDialogViewController(この場合はItemPage)にViewDissapearingイベントを作成し、私が飛び出していますかどうかをチェックすることにより、所望の動作を(「T1」の内容をリフレッシュする)実装 - もしそうであれば、親コントローラのViewDidAppearを呼び出します方法。

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

(あなたが戻ってナビゲートしているときに設定されるだろうと思うだろう何直感的である)、このコードについて面白いことは、実際に動作するプロパティがIsMovingFromParentViewControllerであるということです注意、NOT IsMovingToParentViewController。私はこれがMT.Dialogのバグかもしれないが、逆コンパクトの理由で修正できないものだと思います。

私はこれが誰かを助けることを望む...

関連する問題