UINavigationController上的ViewDidAppear在导航回来时没有被调用

时间:2012-04-15 02:00:05

标签: ios xamarin.ios monotouch.dialog

我有一个UITabBarController来托管5 UINavigationControllers(让他们称之为N1 - N5)。每个UINavigationControllers都有UI元素,可以将UITableViewController推送到导航堆栈(我使用MonoTouch.Dialog DialogViewController来实现这些UITableViewControllers)。让我们称之为T1 - T5。

当我在选项卡之间导航时,会按预期在N1-N5中调用ViewDidAppear方法。但是当我触摸一个UI元素,比如N1,导致T1被推到导航堆栈上,然后尝试使用后退按钮返回时,N1的ViewDidAppear方法没有'被叫。

有趣的是,如果我"标签超过"到另一个标签(比如N2)然后"标签回来"到N1,ViewDidAppear将被正常调用。即使我把T1推到导航堆栈上,如果我做同样的标签,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 个答案:

答案 0 :(得分:1)

我弄清楚发生了什么事。当在内部DialogViewController(在ItemPage中创建)上按下后退按钮时,外部DialogViewController(上面的“T1”)现在是第一个响应者,而不是UINavigationController(“N1” )。我的困惑源于这样一个事实,即我在外侧DialogViewController上关闭了后退按钮,所以我假设我一直弹出UINavigationController(N1),而我仍然在DialogViewController {1}}(T1)。

我通过在内部ViewDissapearing(本例中为ItemPage)上创建DialogViewController事件并检查我是否正在弹出来实现所需的行为(刷新“T1”的内容) - 如果所以,调用父控制器的ViewDidAppear方法。

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

请注意,这段代码的有趣之处在于,实际运行的属性是IsMovingFromParentViewController,而不是IsMovingToParentViewController(这是您在导航回来时直观地设置的内容)。我想这可能是MT.Dialog中的一个错误,但是由于后面紧凑的原因无法修复。

我希望最终帮助某人......