2012-04-14 114 views
2

我試圖在設置完DVC後設置它時,在UI中更新StringElement的'Value'來更新。爲什麼MonoTouch.Dialog對某些元素選項使用公共屬性,對其他元素使用公共屬性

e.g:

public partial class TestDialog : DialogViewController 
{ 
    public TestDialog() : base (UITableViewStyle.Grouped, null) 
    { 
     var stringElement = new StringElement("Hola"); 
     stringElement.Value = "0 Taps"; 
     int tapCount = 0; 
     stringElement.Tapped +=() => stringElement.Value = ++tapCount + " Taps"; 

     Root = new RootElement("TestDialog") 
     { 
      new Section("First Section") 
      { 
       stringElement, 
      }, 
     }; 
    } 
} 

然而StringElement.Value僅僅是一個公共領域,當Element.GetCell稱爲初始化過程中只寫入UICell。

爲什麼不是一個屬性,與邏輯在二傳手更新UICell(像大多數元素,例如EntryElement.Value):

public string Value 
{ 
    get { return val; } 
    set 
    { 
     val = value; 
     if (entry != null) 
      entry.Text = value; 
    } 
} 

編輯:
我做了我自己的版本的StringElement,從Element導出(基本照搬了source code from here逐字)

然後我把它改爲採取類範圍的參考GetCell創建的,而不是功能SCOP細胞編輯。然後改變了Value字段屬性:

public string Value 
{ 
    get { return val; } 
    set 
    { 
     val = value; 
     if (cell != null) 
     { 
      // (The below is copied direct from GetCell) 

      // The check is needed because the cell might have been recycled. 
      if (cell.DetailTextLabel != null) 
       cell.DetailTextLabel.Text = Value == null ? "" : Value; 
     } 
    } 
} 

它工作在最初的測試。然而,我不確定是否允許引用單元格,其他元素似乎都沒有這樣做(它們僅引用控件放置在單元格中的引用)。是否有可能基於一個MonoTouch.Dialog.Element實例創建多個'live'*單元?

*我說現場指示單元目前是活動用戶界面的一部分。從一個子對話框導航回到對話框時,我注意到GetCell方法再次被調用,並且基於元素創建了一個新的單元,但這仍然是元素和活動單元之間的一個1-1。

回答

1

對於主要問題:

爲什麼MonoTouch.Dialog使用一些元素的選項爲他人公共領域和公共屬性?

我已經通過了代碼,我不認爲有任何一致的理由使用。

對話框項目最初並不是MonoTouch項目的一部分 - 我不認爲Miguel知道當他開始寫作和發展它時它會變得多麼有用 - 我認爲他更專注於編寫其他應用程序當時的TweetStation。

我知道有幾個人(包括我!)誰已經分支了代碼並將其用於他們的目的。我猜想在未來某個時候,Xamarin可能會編寫一個更嚴格的編碼標準的2.0版本。

以引用的活細胞

有限使用,你可以做到這一點......但總的來說

表視圖的想法是,當用戶上下滾動時單元格會被重用 - 特別是爲了節省內存和ui資源。由於這是一個很長的列表,因此多個元素可能會引用同一個單元格。

如果你想緩存單元格引用,那麼你可能應該重寫GetCell(),所以它永遠不會嘗試重新使用現有的細胞(永遠不會調用DequeueReusableCell)

或者,你可以嘗試更改一些代碼base元素類,以查明元素是否具有當前連接的單元格 - 這是CurrentAttachedCell在Dialog https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross.Dialog/Dialog/Elements/Element.cs分支中做的事(但該分支具有其他附加功能和依賴項,因此您可能不希望爲此使用它目前的工作!)