如何将MonoTouch.Dialog视图封装到视图控制器中

本文关键字:视图 封装 控制器 Dialog MonoTouch | 更新日期: 2023-09-27 18:28:17

我正在编写一个视图控制器,用于向我的应用程序添加新项目。它非常适合MonoTouch.Dialog,因为它可以通过基于表格的界面轻松完成,并为我的项目的每个相关属性提供一个字段。

这是我目前用于显示添加项目视图的代码(简化了,但核心思想仍然存在):

Item item = new Item();
TapHandler handler = new TapHandler(); 
BindingContext bc = new BindingContext(handler, item, "Add Item");
DialogViewController dv = new DialogViewController(bc.Root, true);
this.NavigationController.PushViewController(dv, true);

虽然这是可行的,但我更希望能将视图的细节封装到它自己的视图控制器中,这样代码就可以看起来像这样:

UIViewController controller = new AddItemViewController();
this.NavigationController.PushViewController(controller, true);

然而,我不知道如何实现这一点。我认为合乎逻辑的做法是创建DialogViewController的子类。然而,DialogViewController的所有构造函数都需要一个RootElement。要做到这一点,您需要首先创建BindingContext。由于在调用基构造函数之前不能运行任何代码,因此它最终无法工作。

我的第二种方法是实现UIViewController的子类,创建DialogViewController,并使用this.AddChildViewController(dv)this.View.AddSubView(dv.View)将对话框视图控制器添加为我的子类。虽然这在最初起作用,但如果在UINavigationController中有新的视图控制器,并单击日期元素,则日期视图将显示为模式弹出窗口,而不是在导航控制器层次结构中。(这是有道理的,因为DialogViewController不是本设计中NavigationController层次结构的一部分)。

从那里我被卡住了。我找不到任何使用MonoTouch.Dialog的例子。这样做可能吗?或者,如果不是,有没有充分的理由说明为什么写这样的代码是个坏主意?

如何将MonoTouch.Dialog视图封装到视图控制器中

由于在调用基础构造函数之前无法运行任何代码

这不太正确。

这并不理想,但您可以从DialogViewController继承并为其提供一个空的RootElement实例,如下所示:

public class AddItemViewController : DialogViewController {
    public AddItemViewController () : base (new RootElement ()) { }
}

稍后,您可以将您的东西(或设置一个新的RootElement)添加到Root属性中,例如

void Populate ()
{
    this.Root.Add (new Section () { ... });
}

我找到了一种方法来做这件事,尽管它看起来有点乱(感谢poupou给我这个主意)。我只是在基本构造函数调用中将Root设置为null,然后在构造函数方法中直接设置它

class NewItemViewController : DialogViewController
{
    private Item _item;
    public NewItemViewController(bool pushing) : base(null, pushing)
    {
        _item = new Item();
        BindingContext bc = new BindingContext(this, _item, "Add Item");
        this.Root = bc.Root;
        // more setup
    }
    // more methods
}

我不知道你可以更改Root对象,而不仅仅是访问它。