根据项目类型,我需要一个具有不同单元格的自定义iOS TableView。看起来很简单,只需在TableViewSource构造函数中定义布局,即MvxTableViewSource的子代。注册如下:
public TableViewSource(UITableView tableView, List<ItemHolder> sections) : base(tableView) {
tableView.RegisterClassForCellReuse(typeof(MyCell), "MyCellId");
[Registering further types here]
}
为了处理部分,我创建了一个ItemHolder来定义部分中的项目,以及部分页眉/页脚。那部分工作正常。
在GetOrCreateCellFor中,我根据给定项目的类型使用默认的DequeueReusableCell
。但是,如果我如上所述注册单元格,则会绘制一个空单元格。
我的单元格使用XIB + Backing类(基于MvxTableViewCell
)方式,理论上应该可以正常工作。如果我使用它的Nib属性,并使用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中,我有一个使用AutoLayout设置的UILabelView,它有一个名为TextView的Outlet。
所以基本上如果我通过类本身添加它,它根本不起作用。如果我使用Nib,那么布局工作,但没有绑定,datacontext等,从技术上讲,我的逻辑已经消失。
我在这里做错了什么,或者这甚至都没有用?
答案 0 :(得分: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();
}