我刚刚开始在MonoMac开展一个项目,到目前为止这个项目非常酷。但是还有一些我不确定的事情。例如:你如何使用数组?这是我发现的:当我从一个正在调用的方法中获得NSArray
时,我尝试获取该数组中的一个自定义对象,我不断得到类似“cannot convert type System.IntPtr to MyType
”的内容。 / p>
NSArray groupArray = (NSArray)groupDictionary.ObjectForKey(key);
MyType myObject = (MyType)groupArray.ValueAt(0);
那是我回来的数组。但是,如果我想自己创建一个数组怎么办? NSArray的实现不允许我实例化它。所以如果我得到MonoMac website权利,我应该使用像这样的普通数组
int[] intArray = int[10];
分别是一个强类型数组,我不知道如何在C#中使用它。
那么去这里的方式是什么?
感谢
-f
答案 0 :(得分:11)
通常,使用NSArray并不是很有用,因为您最终会遇到上述问题。
这就是为什么通常你应该将NSArray转换为强类型数组。 MonoMac低级运行时为您代表的所有回调执行此操作。
通常你会这样做:
YourType [] stronglyTyped = NSArray.ArrayFromHandle<YourType> (arrayIntPtrHandle);
请注意,NSArray只能存储NSObject,因此“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 ();