Question

Je suis juste commencé à travailler sur un projet Monomac, ce qui est assez cool jusqu'à présent. Mais il reste encore quelques choses que je ne suis pas sûr. Par exemple: Comment utilisez-vous des tableaux? Voici ce que j'appris. Quand je reçois un retour de NSArray à partir d'une méthode que je vous appelle et j'essaie d'obtenir l'un des objets personnalisés dans ce tableau, je continue à obtenir quelque chose comme « cannot convert type System.IntPtr to MyType »

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

C'est pour les tableaux que je revienne. Mais si je veux créer un tableau moi-même? La mise en œuvre de NSArray ne me permet pas de instancier. Donc, si je suis le site Monomac droit, j'utiliser un tableau ordinaire comme celui-ci

int[] intArray = int[10];

respectivement un tableau fortement typé que je ne suis pas au courant de la façon de l'utiliser en C #.

Alors, quel est le chemin à parcourir ici?

Merci
-f

Était-ce utile?

La solution

En général, l'utilisation NSArray est pas très utile, parce que vous vous retrouvez avec les problèmes que vous avez décrits ci-dessus.

Ceci est la raison pour laquelle, en général, vous devez convertir le NSArray en un tableau fortement typé. Le moteur d'exécution à faible niveau Monomac fait pour tous les callbacks déjà en votre nom.

Généralement, vous faites ceci:

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

Notez que NSArray ne peut stocker NSObjects, donc les besoins « YourType » d'être un objet dérivé de NSObject.

Maintenant, si vous voulez continuer à utiliser le NSArray, ce que vous devez retenir est que le ValueAt retourne la poignée d'objet sous-jacent (IntPtr), à utiliser avec C # vous devez convertir en un NSObject. Vous faites cela avec la méthode Runtime.GetNSObject, vous pouvez lancer le résultat au type le plus dérivé:

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

Cela étant dit, si vous utilisez l'API des outils de liaison pour accéder à une API Objective-C, vous ne lie pas les choses correctement. Votre API contrat devrait au lieu d'avoir un NSArray devrait avoir la version fortement typé, donc:

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

doit être:

 [Export ("getElements")]
 YourType [] GetElements ();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top