1

我有一个UITabBarController主机 5 UINavigationControllers(我们称它们为 N1 - N5)。每个UINavigationControllers都有 UI 元素,这些元素会导致 UITableViewController 被推送到导航堆栈(我MonoTouch.Dialog DialogViewController用来实现这些UITableViewControllers)。让我们称它们为 T1 - T5。

当我在选项卡之间导航时,该ViewDidAppear方法会按预期在每个 N1 - N5 上调用。但是当我在 N1 上触摸一个 UI 元素时,这会导致 T1 被推入导航堆栈,然后尝试使用后退按钮返回,N1 的ViewDidAppear方法不会被调用。

有趣的是,如果我“切换”到不同的选项卡(比如 N2),然后“切换回”到 N1,ViewDidAppear则会正常调用。即使我将 T1 推到导航堆栈上,如果我执行相同的选项卡,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 中创建)上按下后退按钮时,外部DialogViewController(上面的“T1”)现在是第一个响应者,而不是UINavigationController(“N1”)。我的困惑源于我关闭了外层的后退按钮,DialogViewController所以我假设我一直弹出到UINavigationController(N1),而我仍然在DialogViewController(T1)。

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

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

请注意,这段代码的有趣之处在于,实际起作用的属性是IsMovingFromParentViewController, NOT IsMovingToParentViewController(直观地说,这是您在导航返回时会设置的内容)。我想这可能是 MT.Dialog 中的一个错误,但由于反向紧凑的原因无法修复。

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

于 2012-04-15T04:29:47.600 回答