1

私はUITabBarController5をホストするものを持っていますUINavigationControllers(それらをN1-N5と呼びましょう)。それぞれにUINavigationControllersUI要素があり、UITableViewControllerをナビゲーションスタックにプッシュします(私はMonoTouch.Dialog DialogViewControllerこれらを実装するために使用しますUITableViewControllers)。それらをT1-T5と呼びましょう。

タブ間を移動すると、ViewDidAppear期待どおりにN1〜N5のそれぞれでメソッドが呼び出されます。しかし、たとえばN1のUI要素にタッチすると、T1がナビゲーションスタックにプッシュされ、戻るボタンを使用して戻ろうとすると、N1のViewDidAppearメソッドは呼び出されません。

面白いことに、別のタブ(たとえばN2)に「タブオーバー」してからN1に「タブバック」すると、ViewDidAppear通常どおりに呼び出されます。また、T1をnavスタックにプッシュした場合でも、同じタブを実行すると、N1ViewDidAppearが呼び出されます。

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);
    }
}
4

1 に答える 1

1

私は何が起こっているのか理解しました。DialogViewController内側(ItemPageで作成)で戻るボタンを押すと、外側(上記の「T1」)が(「N1」)ではなくDialogViewController、最初のレスポンダーになります。UINavigationController私の混乱は、そのアウターの戻るボタンをオフにしたという事実から生じたので、私はまだ(T1)にいる間に、(N1)DialogViewControllerまでずっと飛び出したと思っていました。UINavigationControllerDialogViewController

内部(この場合はItemPage)にViewDissapearingイベントを作成し、ポップアウトしているかどうかを確認し、ポップアウトしている場合は親コントローラーのメソッドを呼び出すことで、目的の動作( "T1"の内容を更新)を実装しました。DialogViewControllerViewDidAppear

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

このコードの面白い点は、実際に機能するプロパティがではIsMovingFromParentViewControllerないIsMovingToParentViewControllerことです(これは、ナビゲートしているときに設定されると直感的に思われるものです)。これはMT.Dialogのバグかもしれないと思いますが、バックコンパクトの理由で修正できないものです。

これが誰かを助けることになることを願っています...

于 2012-04-15T04:29:47.600 に答える