嵌套的 Monotouch 对话框 RootElement 视图中缺少后退按钮

Back Button missing from nested Monotouch Dialog RootElement Views

我有两层嵌套的 RootElements,两层都没有后退按钮。

有两点需要说明

  1. 是的,我正在覆盖对话框ViewController并将"pushing"设置为True
  2. 我将 DialogViewController 的视图作为 SubView 添加到我的 MvxViewController 而不是比使用 DialogViewController 作为我的主控制器

我的 ViewController 中有许多子视图,包括一个 UITableView 和一个自定义 UIView。我想使用 MT D 为我提供的方便的控制器嵌套和嵌套的 RootElements,所以我将 DialogViewController.View 作为 SubView 插入。

我创建了普通的 RootElements 和 Sections

RootElement filtersListRootElement = new RootElement("Filters");
Section filterTypes = new Section();
RootElement filterRootElement = new RootElement("Filter Options");
RootElement byDateRoot = new RootElement("Date");
RootElement byCategoryRoot = new RootElement("Category");

filterRootElement.Add(new Section());
filterRootElement.Sections.First().Elements.Add(byDateRoot);
filterRootElement.Sections.First().Elements.Add(byCategoryRoot);

byDateRoot.Add(new Section("Some Stuff"));
byDateRoot.Sections.First().Elements.Add(new CheckboxElement("Yesterday"));
byDateRoot.Sections.First().Elements.Add(new CheckboxElement("Last Week"));
byDateRoot.Sections.First().Elements.Add(new CheckboxElement("Last 6 months"));
byDateRoot.Sections.First().Elements.Add(new CheckboxElement("2 years"));

byCategoryRoot.Add(new Section());
byCategoryRoot.Sections.First().Elements.Add(new CheckboxElement("Medications"));
byCategoryRoot.Sections.First().Elements.Add(new CheckboxElement("Lifestyle"));
byCategoryRoot.Sections.First().Elements.Add(new CheckboxElement("Tests"));

filterTypes.Elements.Add(filterRootElement);
filtersListRootElement.Sections.Add(filterTypes);

然后我将视图向上拉到我的主 ViewController 中,就像这样

DialogViewController filtersListDvc =
    new DialogViewController(UITableViewStyle.Plain, filtersListRootElement, true);
this.AddChildViewController(filtersListDvc);
this.View.AddSubview(filtersListDvc.View);
filtersListDvc.DidMoveToParentViewController(this);

这会按预期显示元素,我可以深入了解每个 RootElement。但是 none 的视图曾经有一个后退按钮,我不明白为什么

这是因为我们使用对话框ViewController 视图的方式。获取 UINavigationController 以将 ViewController 推入的代码查看其 ParentViewController (as you can see here).

然而,正如问题中提到的,我们将 DialogViewController 的视图提升到我们的 ViewController 中,这是不正常的使用。下面是 Monotouch Dialog (MT D) 中的代码。检查 nav 不为空的代码总是发现它为空,因为在我们的用例中 UINavigationController 是另一个级别

public void ActivateController (UIViewController controller)
        {
            dirty = true;

            var parent = ParentViewController;
            var nav = parent as UINavigationController;

            // We can not push a nav controller into a nav controller
            if (nav != null && !(controller is UINavigationController))
                nav.PushViewController (controller, true);
            else
                PresentModalViewController (controller, true);
        }

我们在 MVVMCross 中使用了 MT D 的一个分支,这使得 ActivateController 成为虚拟的,因此我们覆盖它并将查找 UINavigationController 的代码更改为

 this.PushNavigationController = this.PushNavigationController
                                            ?? parent as UINavigationController
                                            ?? parent.ParentViewController as UINavigationController;

这会检查父级,如果不行,它会查看父级的父级