在iOS Xamarin项目

时间:2016-10-17 07:40:54

标签: uitableview mvvm xamarin.ios xamarin.forms tableview

我正在使用ViewModel Xamarin.Forms的第一种方法,并开始编写我自己的Bindable TableView的过程(我想很多人都有)。该项目进展顺利,我已经基于我的CellViewModel类型在UI中渲染单元格,并希望进入下一阶段,将“Disclosure”和“Checkbox”附件等“效果”添加到单元格中。事实证明,这些东西在iOS项目中才真正有意义,所以我发现自己在iOS中专门研究ViewCellRenderers。

为了在单元格上应用适当的附件,我需要创建一个类来执行此操作:

public class AccessoryItemCellRenderer : ViewCellRenderer

本身相对简单。它接受Xamarin Cell的BindingContext,然后适当地应用附件:

var viewModel = item.BindingContext as TableCellViewModel;

if (viewModel != null )
        {
            UITableViewCell cell = base.GetCell(item, reusableCell, tv);

            if (viewModel.Accessories == CellIndicators.Disclosure)
                cell.Accessory = UIKit.UITableViewCellAccessory.DisclosureIndicator;
            else if (viewModel.Accessories == CellIndicators.DisclosureDetail)
                cell.Accessory = UIKit.UITableViewCellAccessory.DetailDisclosureButton;
            else if (viewModel.Accessories == CellIndicators.Detail)
                cell.Accessory = UIKit.UITableViewCellAccessory.DetailButton;
            else if (viewModel.Accessories == CellIndicators.CheckMark)
                cell.Accessory = UIKit.UITableViewCellAccessory.Checkmark;
        }

至少我认为它很简单,因为当base.GetCell调用完成时,它发现我的reusableCell属性为null,而我假设导致System.InvalidCastException然后吹起来。对我来说不是很明显是什么导致它,我得到的唯一真正的堆栈跟踪是这样的:

  at Xamarin.Forms.Platform.iOS.ViewCellRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv) [0x00000] in C:\BuildAgent2\work\aad494dc9bc9783\Xamarin.Forms.Platform.iOS\Cells\ViewCellRenderer.cs:28 

是不是因为某种程度上我的手机没有可重复使用的ID?如果是这种情况,我该如何提供?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

在评论中,您提到您正在为TextCell注册此AccessoryItemCellRenderer。在AccessoryItemCellRenderer中,您继承自ViewCellRenderer,该ViewCellRenderer用于ViewCell。 TextCell不会从ViewCell继承,也不能作为ViewCell进行转换,而且很可能是异常来自的地方。