Uitableview 为什么在iOS Xamarin项目中使用ViewCellRenderer时会出现System.InvalidCastException

Uitableview 为什么在iOS Xamarin项目中使用ViewCellRenderer时会出现System.InvalidCastException,uitableview,mvvm,xamarin.ios,xamarin.forms,tableview,Uitableview,Mvvm,Xamarin.ios,Xamarin.forms,Tableview,我正在使用ViewModel-first方法来处理Xamarin.Forms,并且已经开始编写我自己的可绑定TableView(我想很多人已经这样做了)。该项目进展顺利,我已经基于我的on-CellViewModel类型在UI中呈现了单元格,并希望进入下一阶段,在单元格中添加诸如“披露”和“复选框”附件之类的“效果”。事实证明,这些东西只有在iOS项目中才真正有意义,所以我发现自己专门研究iOS中的ViewCellRenderer 为了在单元格上应用适当的附件,我需要创建一个类: public

我正在使用ViewModel-first方法来处理Xamarin.Forms,并且已经开始编写我自己的可绑定TableView(我想很多人已经这样做了)。该项目进展顺利,我已经基于我的on-CellViewModel类型在UI中呈现了单元格,并希望进入下一阶段,在单元格中添加诸如“披露”和“复选框”附件之类的“效果”。事实证明,这些东西只有在iOS项目中才真正有意义,所以我发现自己专门研究iOS中的ViewCellRenderer

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

public class AccessoryItemCellRenderer : ViewCellRenderer
这本身就相对简单。它获取Xamarin单元格的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?如果是这种情况,我如何提供?非常感谢您的帮助。

在您的评论中提到您正在为TextCell注册此AccessoryItemCellRenderer。在AccessoryItemCellRenderer中,您继承的是ViewCellRenderer,它用于ViewCell。TextCell不是从ViewCell继承的,不能强制转换为ViewCell,这很可能是异常产生的原因。

第28行是哪一行?这不是我的代码,堆栈跟踪是指Xamarin.Forms.Platform.iOS.ViewCellRenderer中的UIKit代码。在我的代码中爆炸的那行是base.GetCell行。啊,我明白了,对不起!最有可能的情况是,您正在尝试渲染ViewCell,而它实际上是其他对象。您试图将此应用于哪些单元格?我的渲染器是在程序集级别定义的,目前用于TextCell的:[assembly:ExportRenderer(typeof(TextCell),typeof(AccessoryItemCellRenderer))],因此,我希望只为该类型的单元格适当调用渲染器。整个“空”可重复使用的细胞让我的蜘蛛感觉刺痛。哇,你有鹰眼,好地方!就在钱上。我假设所有单元格渲染器都继承自ViewCellRenderer(我在下面的示例中使用了一个自定义单元格)。非常感谢。