2016-03-23 3 views
0

Ich versuche, einige Beispiele für die Erstellung einer benutzerdefinierten UITableViewCell in Xamarin.iOS und alle Beispiele da draußen sagen ziemlich dasselbe und verwenden den gleichen Code, aber ich kann ' t es funktioniert. Unten ist meine GetCell Methode auf meiner benutzerdefinierten UITableViewSource:ObjCRuntime.Runtime.GetNSObject Ungültige Cast-Ausnahme

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; 
    } 

Egal, was ich tue, um das Gespräch mit dem ObjCRuntime.GetNSObject wirft immer null ist (oder, in diesem Fall eine ungültige Guss Ausnahme auslöst, weil ich nicht bin Verwenden Sie das Schlüsselwort as absichtlich, um den Punkt zu illustrieren, weil es nicht in meinen benutzerdefinierten Typ umgewandelt werden kann (was UITableViewCell unterklassifiziert). Es scheint ein Problem zu sein, den Wert von NSObject auf meinen verwalteten Typ zu übertragen.

Hier ist einer der examples I'm trying to follow.

Gibt es eine spezielle Magie, die ich vermisse, um das NSObject auf meinen Typ zu werfen?

+0

Können Sie die Erklärung von 'WorkoutPhaseListViewCell' eingeben? – dalexsoto

+0

Hier ist ein Link zum Thema mit der WorkoutPhaseListViewCell: https://gist.github.com/donniefitz2/ad3eb1a4657844fc097e –

Antwort

0

views.ValueAt (0)

, die anderswo gefährliche Annahme als Veränderung (zum Beispiel in der NIB-Datei) in Ihrem Projekt können Sie Ihren Code brechen sein können. Das Hinzufügen einiger (nur Debug-Checks) könnte Ihnen viele zukünftige (oder aktuelle) Probleme ersparen.

Für die InvalidCastException verwenden Sie den Debugger zu erkennen, was in Position ist 0 Ihrer views (das ist ein NSArray). Wenn es kein WorkoutPhaseListViewCell ist (z.B. ein UIView darin), dann ist die Cast-Ausnahme normal.

Stellen Sie außerdem sicher, dass Ihre NIB über die richtige ID verfügt (um mit dem Code übereinzustimmen), und dass Sie einen [Register] auf Ihrem verwalteten WorkoutPhaseListViewCell-Typ haben.

1

Es stellt sich heraus, dass ein Refactor mit Xamarin Studio mein Problem umging. Ich änderte den Namen in WorkoutPhaseListViewCell von WorkoutPhaseListView und XS änderte das Attribut [Register] in der Datei .designer.cs nicht, so dass mein Typ nicht der Typ war, der zur Laufzeit sein sollte.