Xamarin.Forms.Platform.iOS.ViewCellRenderer.GetCell 异常:指定的转换无效
Xamarin.Forms.Platform.iOS.ViewCellRenderer.GetCell Exception: Specified cast is not valid
有人在 Xamarin.Forms 中使用 ViewCellRenderer
时遇到过以下问题吗?
我正在尝试通过自定义呈现器向我的 Xamarin.Forms 自定义 ViewCell
添加披露指示器。
在自定义渲染器中调用 base.GetCell(item, reusableCell, tv)
时,会触发异常:Specified cast is not valid
.
我正在使用 Xamarin.Forms v2.3.3.175.
ViewCell 渲染器
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using SampleApp;
using SampleApp.iOS;
[assembly: ExportRenderer(typeof(PriceControlViewCell), typeof(PriceControlViewCellCustomRenderer))]
namespace SampleApp.iOS
{
public class PriceControlViewCellCustomRenderer : ViewCellRenderer
{
public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
{
var cell = base.GetCell(item, reusableCell, tv);
cell.Accessory = UITableViewCellAccessory.DisclosureIndicator;
return cell;
}
}
}
ViewCell
using Xamarin.Forms;
namespace SampleApp
{
public class PriceControlViewCell : TextCell
{
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
Text = "";
Detail = "";
var item = BindingContext as PriceControlModel;
Text = "Configuration Id";
Detail = item.ConfigurationId.ToString();
}
}
}
堆栈跟踪
at Xamarin.Forms.Platform.iOS.ViewCellRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv) [0x00000] in C:\BuildAgent2\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Cells\ViewCellRenderer.cs:13
at SampleApp.iOS.PriceControlViewCellCustomRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv) [0x00005] in /Users/brandonm/Projects/GitHub/SampleApp/iOS/CustomRenderers/PriceControlViewCellCustomRenderer.cs:16
at Xamarin.Forms.Platform.iOS.CellTableViewCell.GetNativeCell (UIKit.UITableView tableView, Xamarin.Forms.Cell cell, System.Boolean recycleCells, System.String templateId) [0x00086] in C:\BuildAgent2\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Cells\CellTableViewCell.cs:74
at Xamarin.Forms.Platform.iOS.ListViewRenderer+ListViewDataSource.GetCell (UIKit.UITableView tableView, Foundation.NSIndexPath indexPath) [0x00060] in C:\BuildAgent2\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Renderers\ListViewRenderer.cs:727
at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Users/builder/data/lanes/3969/8b53676d/source/xamarin-macios/src/UIKit/UIApplication.cs:79
at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/3969/8b53676d/source/xamarin-macios/src/UIKit/UIApplication.cs:63
at SampleApp.iOS.Application.Main (System.String[] args) [0x00035] in /Users/brandonm/Projects/GitHub/SampleApp/iOS/Main.cs:25
看看您的代码用于 PriceControlViewCell
是什么。我的猜测是它不是 ViewCell
因为 this 失败了:
var viewCell = (ViewCell)item;
更新:
使用 PriceControlViewCell : ViewCell
而不是 PriceControlViewCell : TextCell
。 TextCell
继承自 Cell
,与 ViewCell
相同,而不是 TextCell : ViewCell
。
刚遇到同样的问题,发现还有TextCellRenderer
。我所要做的就是更改自定义渲染器的基础 class。在你的情况下,这意味着而不是
public class PriceControlViewCellCustomRenderer : ViewCellRenderer
使用这个:
public class PriceControlViewCellCustomRenderer : TextCellRenderer
其余代码可以保持不变。在使用 Xamarin 4.5 使用 Visual Studio 15 构建的 iPhone 5 上成功测试。
我还提出了这个作为解决方案 here,因为他们的原始 Todo 示例已经将曾经推荐的披露指示器 hack 注释掉了。
有人在 Xamarin.Forms 中使用 ViewCellRenderer
时遇到过以下问题吗?
我正在尝试通过自定义呈现器向我的 Xamarin.Forms 自定义 ViewCell
添加披露指示器。
在自定义渲染器中调用 base.GetCell(item, reusableCell, tv)
时,会触发异常:Specified cast is not valid
.
我正在使用 Xamarin.Forms v2.3.3.175.
ViewCell 渲染器
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using SampleApp;
using SampleApp.iOS;
[assembly: ExportRenderer(typeof(PriceControlViewCell), typeof(PriceControlViewCellCustomRenderer))]
namespace SampleApp.iOS
{
public class PriceControlViewCellCustomRenderer : ViewCellRenderer
{
public override UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
{
var cell = base.GetCell(item, reusableCell, tv);
cell.Accessory = UITableViewCellAccessory.DisclosureIndicator;
return cell;
}
}
}
ViewCell
using Xamarin.Forms;
namespace SampleApp
{
public class PriceControlViewCell : TextCell
{
protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();
Text = "";
Detail = "";
var item = BindingContext as PriceControlModel;
Text = "Configuration Id";
Detail = item.ConfigurationId.ToString();
}
}
}
堆栈跟踪
at Xamarin.Forms.Platform.iOS.ViewCellRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv) [0x00000] in C:\BuildAgent2\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Cells\ViewCellRenderer.cs:13
at SampleApp.iOS.PriceControlViewCellCustomRenderer.GetCell (Xamarin.Forms.Cell item, UIKit.UITableViewCell reusableCell, UIKit.UITableView tv) [0x00005] in /Users/brandonm/Projects/GitHub/SampleApp/iOS/CustomRenderers/PriceControlViewCellCustomRenderer.cs:16
at Xamarin.Forms.Platform.iOS.CellTableViewCell.GetNativeCell (UIKit.UITableView tableView, Xamarin.Forms.Cell cell, System.Boolean recycleCells, System.String templateId) [0x00086] in C:\BuildAgent2\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Cells\CellTableViewCell.cs:74
at Xamarin.Forms.Platform.iOS.ListViewRenderer+ListViewDataSource.GetCell (UIKit.UITableView tableView, Foundation.NSIndexPath indexPath) [0x00060] in C:\BuildAgent2\work\ca3766cfc22354a1\Xamarin.Forms.Platform.iOS\Renderers\ListViewRenderer.cs:727
at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
at UIKit.UIApplication.Main (System.String[] args, System.IntPtr principal, System.IntPtr delegate) [0x00005] in /Users/builder/data/lanes/3969/8b53676d/source/xamarin-macios/src/UIKit/UIApplication.cs:79
at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Users/builder/data/lanes/3969/8b53676d/source/xamarin-macios/src/UIKit/UIApplication.cs:63
at SampleApp.iOS.Application.Main (System.String[] args) [0x00035] in /Users/brandonm/Projects/GitHub/SampleApp/iOS/Main.cs:25
看看您的代码用于 PriceControlViewCell
是什么。我的猜测是它不是 ViewCell
因为 this 失败了:
var viewCell = (ViewCell)item;
更新:
使用 PriceControlViewCell : ViewCell
而不是 PriceControlViewCell : TextCell
。 TextCell
继承自 Cell
,与 ViewCell
相同,而不是 TextCell : ViewCell
。
刚遇到同样的问题,发现还有TextCellRenderer
。我所要做的就是更改自定义渲染器的基础 class。在你的情况下,这意味着而不是
public class PriceControlViewCellCustomRenderer : ViewCellRenderer
使用这个:
public class PriceControlViewCellCustomRenderer : TextCellRenderer
其余代码可以保持不变。在使用 Xamarin 4.5 使用 Visual Studio 15 构建的 iPhone 5 上成功测试。 我还提出了这个作为解决方案 here,因为他们的原始 Todo 示例已经将曾经推荐的披露指示器 hack 注释掉了。