2016-03-23 120 views
0

我想按照一些例子在Xamarin.iOS中創建一個自定義的UITableViewCell和所有的例子都差不多說了相同的東西,並使用相同的代碼,但我可以'讓它工作。下面是我GetCell方法對我的自定義UITableViewSource:ObjCRuntime.Runtime.GetNSObject無效鑄造異常

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的電話永遠是空(或者,在這種情況下拋出一個無效的轉換異常,因爲我不是使用as關鍵字來說明這一點),因爲它不能轉換爲我的自定義類型(它是UITableViewCell的子類)。這似乎是從NSObject的值轉換爲我的託管類型的問題。

這是examples I'm trying to follow之一。

是否有一些特殊的魔法可以將NSObject轉換爲我的類型?

+0

你可以主張'WorkoutPhaseListViewCell'的聲明嗎? – dalexsoto

+0

下面是WorkoutPhaseListViewCell的要點鏈接:https://gist.github.com/donniefitz2/ad3eb1a4657844fc097e –

回答

0

views.ValueAt(0)

這可能是危險的假設爲(在NIB文件例如)在你的項目可以打破你的代碼的其他地方的變化。添加一些(僅調試)檢查可能爲您節省很多未來(或現在)的麻煩。

對於InvalidCastException,請使用調試器來確定(這是一個NSArray)的位置0。如果它不是WorkoutPhaseListViewCell(例如其中的UIView),那麼演員例外是正常的。

還要確保您的NIB具有正確的標識符集(以匹配代碼),並且您的管理WorkoutPhaseListViewCell類型上有一個[Register]

1

事實證明,使用Xamarin Studio的重構引起了我的問題。我將WorkoutPhaseListViewCell的名稱從WorkoutPhaseListView更改爲X,並且沒有更改.designer.cs文件中的[Register]屬性,所以我的類型不是它應該在運行時的類型。