Как вы инкапсулируете представление MonoTouch.Dialog в контроллер представления? - PullRequest
7 голосов
/ 20 марта 2012

Я пишу контроллер представления для добавления нового элемента в мое приложение.Он идеально подходит для MonoTouch.Dialog, так как это легко сделать с помощью интерфейса на основе таблицы, с полем для соответствующего свойства моего элемента.

Это код, который у меня есть в настоящее время для отображения элемента добавленияview (упрощенно, но основная идея остается):

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, как это в примерах.Возможно ли это сделать?Или, если это не так, есть ли веская причина, почему написание такого кода - плохая идея?

Ответы [ 2 ]

5 голосов
/ 20 марта 2012

Поскольку вы не можете запустить любой код перед вызовом базового конструктора

Это не совсем правильно.

Это не идеально, но вы можете наследовать от DialogViewController и предоставить ему пустой экземпляр RootElement, например:

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

Позже вы можете добавить свои вещи (или установить новый RootElement) в свойство Root, например,

void Populate ()
{
    this.Root.Add (new Section () { ... });
}
3 голосов
/ 21 марта 2012

Я нашел способ сделать это, хотя это выглядит немного грязно (спасибо 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-объект, а не просто получить к нему доступ.

...