2012-03-20 123 views
7

我正在寫一個視圖控制器,用於將新項目添加到我的應用程序。它非常適合MonoTouch.Dialog,因爲它可以使用基於表格的界面輕鬆完成,每個項目的相關屬性都有一個字段。如何將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的例子。這可能嗎?或者,如果不是這樣,爲什麼編寫這樣的代碼是一個壞主意,是否有充分的理由?

回答

3

我發現了一種方法來做到這一點,雖然它似乎有點凌亂(感謝poupou給我的想法)。我剛纔設置的根在基礎構造函數調用空,然後將其設置在構造器方法立竿見影:

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 
} 

我不知道,你可以改變根對象,不只是訪問它。

5

正如你不能調用基類的構造

這是不完全正確之前運行任何代碼。

這不是理想的,但你可以從DialogViewController繼承併爲它提供一個空RootElement情況下,像這樣:

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

稍後,您可以添加你的東西(或設置新的RootElement)到Root財產,例如

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

謝謝,我沒有想到在構造函數中手動使用Root元素。我通過在構造函數中設置一個新的Root元素,讓我自己的答案適用於反射api。 – 2012-03-20 23:47:06

相關問題