ObjCRuntime.Runtime.GetNSObject无效的强制转换异常

时间:2016-03-23 05:23:02

标签: c# xamarin xamarin.ios xamarin-studio

我正在尝试按照一些示例在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强制转换为我的类型?

2 个答案:

答案 0 :(得分:1)

事实证明,使用Xamarin Studio的重构解决了我的问题。我从WorkoutPhaseListView将名称更改为WorkoutPhaseListViewCell,而XS没有更改.designer.cs文件中的[Register]属性,因此我的类型不是它应该在运行时的类型。

答案 1 :(得分:0)

  

views.ValueAt(0)

这可能是危险的假设,因为项目中其他地方(例如在NIB文件中)的更改可能会破坏您的代码。添加一些(仅限调试)检查可能会为您节省很多未来(或现在)的麻烦。

对于InvalidCastException,请使用调试器来确定0views的{​​{1}}位置NSArray。如果它不是WorkoutPhaseListViewCell(例如其中的UIView),那么投射例外是正常的。

另外,请确保您的NIB具有正确的标识符集(以匹配代码),并确保您的托管[Register]类型具有WorkoutPhaseListViewCell