2017-07-07 45 views
0

我需要一個具有不同單元的自定義iOS TableView,具體取決於項目類型。看起來很簡單,只需在TableViewSource構造函數中定義佈局,這是MvxTableViewSource的子項。註冊碰巧是這樣的:MvxTableViewCell加載一個空視圖

public TableViewSource(UITableView tableView, List<ItemHolder> sections) : base(tableView) { 
    tableView.RegisterClassForCellReuse(typeof(MyCell), "MyCellId"); 
    [Registering further types here] 
} 

處理的部分我已經創建了一個定義了部分項目的ItemHolder和部分頁眉/頁腳。這部分工作得很好。

在GetOrCreateCellFor,我使用基於給定項的類型的默認DequeueReusableCell。但是,如果我如上所述註冊單元格,將繪製一個空單元格。

我的小區使用XIB +支持類(基於MvxTableViewCell)的方式,理論上應該能正常運行。如果我使用它的筆尖財產,並使用RegisterNibForCellReuse,內容被繪製(但行高度是錯誤的,和有約束力的情況不會發生,因爲它是在支持類中定義)。

類看起來是這樣的:

public partial class MyCell : MvxTableViewCell 
{ 
    public static readonly NSString Key = new NSString("MyCell"); 
    public static readonly UINib Nib = UINib.FromName("MyCell", NSBundle.MainBundle); 

    protected MyCell(IntPtr handle) : base(handle) 
    { 
     this.DelayBind(() => 
     { 
      var binding = this.CreateBindingSet<MyCell, object>(); 
      binding.Bind(this.TextView.Text).To(vm => vm.GetType().Name).WithConversion(new StringFormatConverter(), "Unknown cell type: {0}"); 
      binding.Apply(); 
     }); 
    } 

    public static MyCell Create() 
    { 
     return (MyCell)Nib.Instantiate(null, null)[0]; 
    } 
} 

在XIB我有一個UILabelView設置了自動版式,即有一個叫做TextView的一個出口。

所以基本上如果我通過類本身添加它,它根本不起作用。如果我使用Nib,那麼佈局是可行的,但是沒有綁定,datacontext等,在技術上我的邏輯已經消失了。

我在這裏做錯了什麼,或者這甚至不應該工作?

回答

1

立即伸出的一件事就是定義綁定的方式。你並不需要綁定TextView.Text,你只是傳遞TextView的:

binding.Bind(TextView).To(vm => vm.GetType().Name).WithConversion(new StringFormatConverter(), "Unknown cell type: {0}"); 

該修補程序可能只是得到的一切爲你工作。否則,這對MvvmCross來說適用於我在XIB文件中定義的單元格佈局:

1.)我使用RegisterNibForCellReuse來註冊我的單元格。

2.)而不是在構造函數中使用this.DelayBind(() =>。我在AwakeFromNib覆蓋我的綁定:

public override void AwakeFromNib() 
{ 
    base.AwakeFromNib(); 

    var binding = this.CreateBindingSet<MyCell, MyCellViewModel>(); 
    binding.Bind(TextView).To(vm => vm.GetType().Name).WithConversion(new StringFormatConverter(), "Unknown cell type: {0}"); 
    binding.Apply(); 
} 
+0

我的標籤有一個默認的調試值,所以我應該看到至少。但由此產生的細胞是完全空的。 – fonix232

+0

我試着將綁定移動到AwakeFromNib,但仍繪製相同的空單元格。檢查返回的單元格,它們確實是MyCell類型,但它們不會被繪製。 – fonix232

+0

好的,我糾正了。在用'RegisterNibForCellReuse'替換'RegisterClassForCellReuse'後,現在它工作正常。顯然iOS邏輯是完全顛倒的(Nib,即UI參考後臺代碼,而不是代碼參考UI)。 – fonix232