Une bonne façon d'utiliser des tableaux dans Monomac
-
29-09-2019 - |
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
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 ();