2010-11-06 8 views
5

Ich habe gerade angefangen an einem Projekt in MonoMac zu arbeiten, was bisher ziemlich cool ist. Aber da sind noch einige Dinge, von denen ich mir nicht sicher bin. Zum Beispiel: Wie benutzt man Arrays? Hier ist, was ich herausgefunden habe: Wenn ich eine NSArray von einer Methode, die ich anrufe, zurückbekomme und ich versuche, eines der benutzerdefinierten Objekte in diesem Array zu bekommen, bekomme ich etwas wie "cannot convert type System.IntPtr to MyType".Die richtige Art Arrays in MonoMac zu verwenden

NSArray groupArray = (NSArray)groupDictionary.ObjectForKey(key); 
MyType myObject = (MyType)groupArray.ValueAt(0); 

Das für Arrays ist bekomme ich zurück. Aber was, wenn ich selbst ein Array erstellen möchte? Die Implementierung von NSArray erlaubt mir nicht, es zu instanziieren. Also, wenn ich bekomme das MonoMac website Recht, soll ich ein gewöhnliches Array verwenden wie diese

int[] intArray = int[10]; 

jeweils eine stark typisierte Array, die ich bin mir nicht bewusst, wie es zu benutzen, in C#.

Also, wie geht es hier?

Dank
-f

Antwort

10

Im Allgemeinen NSArray verwendet, ist nicht sehr nützlich, da Sie sich mit den Problemen am Ende, die Sie oben beschrieben.

Aus diesem Grund sollten Sie das NSArray im Allgemeinen in ein stark typisiertes Array konvertieren. Die Low-Level-Laufzeitumgebung von MonoMac erledigt dies für alle Callbacks, die bereits in Ihrem Namen sind.

Normalerweise würden Sie dies tun:

YourType [] stronglyTyped = NSArray.ArrayFromHandle<YourType> (arrayIntPtrHandle); 

Beachten Sie, dass NSArray kann nur speichern NSObjects, so „Yourtype“ muss ein Objekt von NSObject abgeleitet sein.

Wenn Sie immer noch das NSArray verwenden möchten, müssen Sie sich daran erinnern, dass ValueAt das zugrunde liegende Objekthandle (das IntPtr) zurückgibt. Um dieses mit C# zu verwenden, müssen Sie dieses in ein NSObject konvertieren. Sie tun dies mit dem Runtime.GetNSObject Methode können Sie das Ergebnis an den meisten abgeleiteten Typ Stimmen:

YourType x = (YourType) Runtime.GetNSObject (NSArray.ValueAt (0)); 

aber sagen, dass, wenn Sie die API-Bindungs ​​Tools verwenden eine Objective-C-API zugreifen zu können, sind Dinge nicht richtig binden. Ihr Vertrag API sollte anstelle von ein NSArray die stark typisierte Version haben sollte, so:

[Export ("getElements")] 
NSArray GetElements(); 

Sollte sich:

[Export ("getElements")] 
YourType [] GetElements(); 
+0

Dank Miguel, dass der Trick! Beste. – flohei

Verwandte Themen