Frage

Ich arbeite in MonoMac an einem Projekt gerade erst begonnen, die bisher ziemlich cool ist. Aber es sind noch einige Dinge, die ich bin mir nicht sicher. Zum Beispiel: Wie verwenden Sie Arrays? Hier ist, was ich herausgefunden hat. Wenn ich eine NSArray zurück von einem Verfahren erhalten, ich rufe und ich versuche, eine der benutzerdefinierten Objekte in diesem Array zu bekommen ich so etwas wie „cannot convert type System.IntPtr to MyType“ erhalte

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

das ist für Arrays komme ich zurück. Aber was, wenn ich will einen Array auf meinem eigenen schaffen? Die Implementierung von NSArray erlaubt mir nicht, es zu instanziieren. Also, wenn ich die MonoMac Website richtig verstanden habe, sollte ich ein gewöhnliches Array wie diese

verwenden
int[] intArray = int[10];

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

Was ist also die Art und Weise geht es weiter?

Danke
-f

War es hilfreich?

Lösung

In der Regel NSArray verwendet, ist nicht sehr nützlich, da Sie sich mit den Problemen am Ende, dass Sie oben beschrieben.

Aus diesem Grund ist in der Regel sollten Sie die NSArray in eine stark typisierte Array konvertieren. Die MonoMac Low-Level-Laufzeit tut dies für alle Rückrufe bereits in Ihrem Namen.

In der Regel würden Sie dies tun:

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

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

Wenn Sie nun noch die NSArray verwenden möchten, was Sie sich merken müssen, ist, dass die ValueAt gibt die zugrunde liegende Objekt-Handle (das IntPtr), diese zu verwenden, um mit C # müssen Sie diese in eine NSObject konvertieren. Sie tun dies mit dem Runtime.GetNSObject Methode können Sie das Ergebnis an den meisten abgeleiteten Typ werfen:

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

That being said, wenn Sie die API-Bindungs ??Tools verwenden eine Objective-C-API zugreifen, Sie sind nicht richtig Dinge verbindlich. Ihr Vertrag API sollte anstelle von einem NSArray die stark typisierte Version haben sollte, so:

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

Sollte werden:

 [Export ("getElements")]
 YourType [] GetElements ();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top