2010-11-06 4 views
5

Je viens de commencer à travailler sur un projet en MonoMac, ce qui est assez cool jusqu'à présent. Mais il y a encore des choses dont je ne suis pas sûr. Par exemple: Comment utilisez-vous les tableaux? Voici ce que j'ai découvert: Quand je reçois un NSArray retour d'une méthode que j'appelle et j'essaie d'obtenir un des objets personnalisés dans ce tableau, je continue à obtenir quelque chose comme "cannot convert type System.IntPtr to MyType".Façon correcte d'utiliser des tableaux dans MonoMac

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

C'est pour les tableaux que je reviens. Mais que faire si je veux créer un tableau tout seul? L'implémentation de NSArray ne me permet pas de l'instancier. Donc, si je suis le droit MonoMac website, 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?

Merci
-f

Répondre

10

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

C'est pourquoi, en général, vous devez convertir NSArray en un tableau fortement typé. L'exécution MonoMac de bas niveau le fait pour tous les rappels déjà en votre nom.

Généralement, vous faites ceci:

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

Notez que NSArray ne pouvez NSObjects stocker, donc « YourType » doit être un objet dérivé de NSObject. Maintenant, si vous voulez toujours utiliser NSArray, vous devez vous rappeler que ValueAt renvoie le descripteur d'objet sous-jacent (IntPtr), pour l'utiliser avec C#, vous devez le convertir en NSObject. Vous faites cela avec la méthode Runtime.GetNSObject, vous pouvez lancer le résultat le plus type dérivé:

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

Cela étant dit, si vous utilisez les outils de liaison API pour accéder à une API Objective-C, vous êtes 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(); 

deviendrais:

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

Merci Miguel, qui a fait l'affaire! Meilleur. – flohei

Questions connexes