我正在尝试按照一些示例在Xamarin.iOS中创建自定义UITableViewCell,并且那里的所有示例几乎都说同样的事情并使用相同的代码,但我无法使其正常工作。下面是我的自定义UITableViewSource上的GetCell方法:
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
var cell = tableView.DequeueReusableCell(CellIdentifier) as WorkoutPhaseListViewCell;
if (cell == null)
{
cell = new WorkoutPhaseListViewCell();
var views = NSBundle.MainBundle.LoadNib("WorkoutPhaseListView", cell, null);
cell = (WorkoutPhaseListViewCell)ObjCRuntime.Runtime.GetNSObject(views.ValueAt(0));
}
WorkoutPhase item = WorkoutPhases[indexPath.Row];
return cell;
}
无论我做什么,抛出ObjCRuntime.GetNSObject的调用总是为null(或者,在这种情况下抛出一个无效的强制转换异常,因为我没有故意使用as关键字来说明这一点)因为它可以不能转换为我的自定义类型(它是UITableViewCell的子类)。将值从NSObject转换为托管类型似乎是一个问题。
这是examples I'm trying to follow之一。
我是否有一些特殊的魔法可以将NSObject强制转换为我的类型?
答案 0 :(得分:1)
事实证明,使用Xamarin Studio的重构解决了我的问题。我从WorkoutPhaseListView将名称更改为WorkoutPhaseListViewCell,而XS没有更改.designer.cs文件中的[Register]属性,因此我的类型不是它应该在运行时的类型。
答案 1 :(得分:0)
views.ValueAt(0)
这可能是危险的假设,因为项目中其他地方(例如在NIB文件中)的更改可能会破坏您的代码。添加一些(仅限调试)检查可能会为您节省很多未来(或现在)的麻烦。
对于InvalidCastException
,请使用调试器来确定0
(views
的{{1}}位置NSArray
。如果它不是WorkoutPhaseListViewCell
(例如其中的UIView
),那么投射例外是正常的。
另外,请确保您的NIB具有正确的标识符集(以匹配代码),并确保您的托管[Register]
类型具有WorkoutPhaseListViewCell
。