2012-03-20 13 views
7

Sto scrivendo un controller di visualizzazione per aggiungere un nuovo elemento alla mia app. Si adatta perfettamente a MonoTouch.Dialog, in quanto può essere fatto facilmente con un'interfaccia basata su tabella, con un campo per proprietà rilevante del mio articolo.Come si incapsula una vista di MonoTouch.Dialog in un controller di visualizzazione?

Questo è il codice che ho attualmente in mostra la vista dell'elemento aggiuntivo (semplificato, ma l'idea di base rimane):

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); 

Mentre che funziona, io preferirei se potevo incapsulare i dettagli della vista nel proprio controller della vista, in modo che il codice potrebbe assomigliare a questo:

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

Tuttavia, non riesco a capire come implementare questa. Ho pensato che la cosa logica da fare sarebbe stata creare una sottoclasse di DialogViewController. Tuttavia, tutti i costruttori di DialogViewController richiedono un RootElement. Per ottenere ciò, è necessario innanzitutto creare lo BindingContext. Poiché non è possibile eseguire alcun codice prima di chiamare il costruttore base, non funziona.

Il secondo approccio è stato quello di implementare sottoclasse di UIViewController, creare il DialogViewController, e l'aggiungere il controller della vista finestra come un bambino della mia sottoclasse utilizzando this.AddChildViewController(dv) e this.View.AddSubView(dv.View). Mentre questo funziona inizialmente, se si dispone del nuovo controller di visualizzazione in un UINavigationController e si fa clic su un elemento di data, la vista della data viene visualizzata come popup modale anziché nella gerarchia del controller di navigazione. (Questo ha senso, dato che lo DialogViewController non fa parte della gerarchia NavigationController in questo disegno).

Da lì sono bloccato. Non sono riuscito a trovare alcun esempio di come usare MonoTouch.Dialog negli esempi. È possibile farlo? O se non lo è, c'è una buona ragione per cui scrivere codice come questo è una cattiva idea?

risposta

3

Ho trovato un modo per farlo, anche se sembra un po 'disordinato (grazie poupou per avermi dato l'idea). Ho appena impostato Root per nulla nella chiamata costruttore di base, e poi lo misi subito nel metodo 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 
} 

io non era a conoscenza si potrebbe cambiare l'oggetto principale, non solo accedervi.

5

Come non è possibile eseguire alcun codice prima di chiamare il costruttore di base

Questo non è del tutto corretto.

Non è l'ideale, ma si può ereditare da DialogViewController e dotarla di un RootElement esempio vuoto, in questo modo:

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

In seguito è possibile aggiungere le cose (o impostare un nuovo RootElement) alla proprietà Root, per esempio

+0

Grazie, non ho pensato di utilizzare manualmente l'elemento Root nel costruttore. Ho creato la mia risposta che funziona con la reflection api impostando un nuovo elemento Root nel costruttore. –

Problemi correlati