我正在编写一个视图控制器,用于向我的应用添加新项目。它非常适合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的任何示例。这可能吗?或者如果不是,那么为什么写这样的代码是个坏主意有充分的理由吗?
答案 0 :(得分:5)
在调用基础构造函数
之前,您无法运行任何代码
这不太正确。
它不理想,但您可以继承DialogViewController
并为其提供一个空的RootElement
实例,如下所示:
public class AddItemViewController : DialogViewController {
public AddItemViewController () : base (new RootElement ()) { }
}
稍后您可以将您的内容(或设置新的RootElement
)添加到Root
属性,例如
void Populate ()
{
this.Root.Add (new Section () { ... });
}
答案 1 :(得分:3)
我找到了一种方法来做到这一点,虽然看起来有点乱(感谢poupou给我这个想法)。我只是在基础构造函数调用中将Root设置为null,然后在contructor方法中立即设置它:
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对象,而不仅仅是访问它。