2010-11-06 2 views
5

Я только начал работать над проектом в MonoMac, который до сих пор довольно крут. Но есть еще кое-что, о чем я не уверен. Например: как вы используете массивы? Вот что я узнал: когда я получаю NSArray от метода, который я вызываю, и я пытаюсь получить один из пользовательских объектов в этом массиве, я получаю что-то вроде «cannot convert type System.IntPtr to MyType».Правильный способ использования массивов в MonoMac

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

Это для массивов. Я возвращаюсь. Но что, если я хочу создать массив самостоятельно? Реализация NSArray не позволяет мне создавать экземпляр. Так что, если я получил MonoMac website право, я должен использовать обычный массив, как этот

int[] intArray = int[10]; 

соответственно строго типизированный массив, который я не знаю, как использовать его в C#.

Итак, как сюда добраться?

Благодаря
-f

ответ

10

В общем, использование NSArray не очень полезно, потому что вы в конечном итоге с проблемами, которые Вы описали выше.

Вот почему в общем случае вы должны преобразовать NSArray в строго типизированный массив. Сценарий для низкоуровневого исполнения MonoMac делает это для всех обратных вызовов уже от вашего имени.

Обычно вы могли бы сделать это:

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

Обратите внимание, что NSArray может хранить только NSObjects, поэтому «YourType» должна быть объектом, полученный из NSObject.

Теперь, если вы все еще хотите использовать NSArray, вам нужно помнить, что ValueAt возвращает дескриптор базового объекта (IntPtr), чтобы использовать его с C#, вам нужно преобразовать его в NSObject. Вы можете сделать это с помощью метода Runtime.GetNSObject можно привести результат к наиболее производный тип:

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

Это, как говорится, если вы используете API связывания инструментов для доступа к Objective-C API, вы не связывая вещи правильно. Ваш контракт API вместо должен иметь NSArray должны иметь строго типизированный версию, так:

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

должны стать:

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

Благодаря Miguel, что сделал трюк! Лучший. – flohei

 Смежные вопросы

  • Нет связанных вопросов^_^