Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin.ios Xamarin中的结合多维阵列_Xamarin.ios_Xamarin - Fatal编程技术网

Xamarin.ios Xamarin中的结合多维阵列

Xamarin.ios Xamarin中的结合多维阵列,xamarin.ios,xamarin,Xamarin.ios,Xamarin,我正在尝试绑定一个属性,我知道它是一个(多维)NSArray持有NSArray对象,而这些对象又持有NSObject的实例。我已将该方法绑定为: [Export ("options")] NSObject[][] Options { get; set; } 当我构建绑定时,在为上述属性生成的类中会出现以下错误 从对NSArray.FromNSObjects的生成调用: (1) Argument `#1` cannot convert 'Foundation.NSObject[][]' expr

我正在尝试绑定一个属性,我知道它是一个(多维)
NSArray
持有
NSArray
对象,而这些对象又持有
NSObject
的实例。我已将该方法绑定为:

[Export ("options")]
NSObject[][] Options { get; set; }
当我构建绑定时,在为上述属性生成的类中会出现以下错误

从对
NSArray.FromNSObjects
的生成调用:

(1) Argument `#1` cannot convert 'Foundation.NSObject[][]' expression to type 'Foundation.NSObject[]'.
(2) Error CS1502: The best overloaded method match for `Foundation.NSArray.FromNSObjects(params Foundation.NSObject[])' has some invalid arguments (CS1502)
从对
NSArray.ArrayFromHandle
的生成调用:

(1)错误CS0311:类型'Foundation.NSObject[]不能用作泛型类型或方法'Foundation.NSArray.ArrayFromHandle(System.IntPtr)'中的类型参数'T'。没有从'Foundation.NSObject[]到'ObjCRuntime.INativeObject'的隐式引用转换(CS0311)
这些错误一直指编译器无法在
Foundation.NSObject[][]
Foundation.NSObject[]
之间进行转换。我不明白为什么这会是一个问题,
NSArray
NSObject
的子类,那么为什么它不能将第二个数组维度视为
NSObject


(我知道我有其他选择,比如将选项绑定为
NSObject[]
,或者只是简单地
NSObject
,但我更愿意尽可能地确保类型安全。)

我认为这个问题的出现是因为来自nsobjects和
ArrayFromHandle
的方法无法处理多维数组的转换,但我不完全确定

通过从绑定文件(ApiDefinition.cs)中删除
Options
的绑定并在分部类中手动绑定属性,我成功地解决了这个问题

我编写了两种方法来在多维
NSArray
NSObject[][]
之间进行转换

    private NSArray NSArraysFromTwoDimentionalArray(NSObject[][] firstDimension) {
        NSMutableArray nsFirstDimension = new NSMutableArray ();

        foreach (NSObject[] secondDimention in firstDimension) {
            NSMutableArray nsSecondDimension = new NSMutableArray ();
            foreach (NSObject nsObj in secondDimention) {
                nsSecondDimension.Add (nsObj);
            }
            nsFirstDimension.Add (nsSecondDimension);
        }

        NSArray toReturn = (NSArray)nsFirstDimension.Copy ();

        nsFirstDimension.Dispose ();

        return toReturn;
    }

    private NSObject[][] TwoDimentionalArrayFromArrayOfNSArrays (NSArray[] nsFirstDimension) {
        NSObject[][] firstDimension = new NSObject[nsFirstDimension.Length][];

        int i = 0;
        foreach (NSArray nsSecondDimension in nsFirstDimension) {
            NSObject[] secondDimension = NSArray.ArrayFromHandle<NSObject> (nsSecondDimension.Handle);

            firstDimension[i] = secondDimension;
            i++;
        }

        return firstDimension;
    }
private NSArray nsarraysfromTwoDimensionalArray(NSObject[]firstDimension){
NSMutableArray nsFirstDimension=新的NSMutableArray();
foreach(NSObject[]第一维度中的第二维度){
NSMutableArray nsSecondDimension=新的NSMutableArray();
foreach(第二维度中的NSObject nsObj){
nsSecondDimension.Add(nsObj);
}
nsFirstDimension.Add(nsSecondDimension);
}
NSArray toReturn=(NSArray)nsFirstDimension.Copy();
nsFirstDimension.Dispose();
回归回归;
}
私有NSObject[]TwomensionalArrayFromaryOfnSarray(NSArray[]nsFirstDimension){
NSObject[][]firstDimension=新NSObject[nsFirstDimension.Length]];
int i=0;
foreach(NSArray nsFirstDimension中的nsSecondDimension){
NSObject[]secondDimension=NSArray.ArrayFromHandle(nsSecondDimension.Handle);
第一维度[i]=第二维度;
i++;
}
返回第一维度;
}
然后,我使用上述转换方法来实现绑定

    public virtual NSObject[][] Options {
        [Export ("options")]
        get {

            NSArray[] firstDimension;
            if (IsDirectBinding) {
                firstDimension = NSArray.ArrayFromHandle<NSArray> (ApiDefinition.Messaging.IntPtr_objc_msgSend (this.Handle, Selector.GetHandle ("options")));
            } else {
                firstDimension = NSArray.ArrayFromHandle<NSArray> (ApiDefinition.Messaging.IntPtr_objc_msgSendSuper (this.SuperHandle, Selector.GetHandle ("options")));
            }

            return TwoDimentionalArrayFromArrayOfNSArrays (firstDimension);
        }


        [Export ("setOptions:")]
        set {
            if (value == null)
                throw new ArgumentNullException ("value");

            var multiNSArray = NSArraysFromTwoDimentionalArray (value);

            if (IsDirectBinding) {
                ApiDefinition.Messaging.void_objc_msgSend_IntPtr (this.Handle, Selector.GetHandle ("setOptions:"), multiNSArray.Handle);
            } else {
                ApiDefinition.Messaging.void_objc_msgSendSuper_IntPtr (this.SuperHandle, Selector.GetHandle ("setOptions:"), multiNSArray.Handle);
            }
            multiNSArray.Dispose ();

        }

    }
公共虚拟NSObject[]选项{
[出口(“期权”)]
得到{
NSArray[]第一维度;
if(IsDirectBinding){
firstDimension=NSArray.ArrayFromHandle(ApiDefinition.Messaging.IntPtr_objc_msgSend(this.Handle,Selector.GetHandle(“选项”));
}否则{
firstDimension=NSArray.ArrayFromHandle(ApiDefinition.Messaging.IntPtr_objc_msgSendSuper(this.SuperHandle,Selector.GetHandle(“选项”));
}
返回二维数组格式的数组Fnsarray(第一维);
}
[导出(“设置选项:”)]
设置{
如果(值==null)
抛出新的ArgumentNullException(“值”);
var multiNSArray=nsarraysfromTwoDimensionalArray(值);
if(IsDirectBinding){
ApiDefinition.Messaging.void_objc_msgSend_IntPtr(this.Handle,Selector.GetHandle(“setOptions:”),multiNSArray.Handle);
}否则{
ApiDefinition.Messaging.void_objc_msgSendSuper_IntPtr(this.SuperHandle,Selector.GetHandle(“setOptions:”),multiNSArray.Handle);
}
Dispose();
}
}
    public virtual NSObject[][] Options {
        [Export ("options")]
        get {

            NSArray[] firstDimension;
            if (IsDirectBinding) {
                firstDimension = NSArray.ArrayFromHandle<NSArray> (ApiDefinition.Messaging.IntPtr_objc_msgSend (this.Handle, Selector.GetHandle ("options")));
            } else {
                firstDimension = NSArray.ArrayFromHandle<NSArray> (ApiDefinition.Messaging.IntPtr_objc_msgSendSuper (this.SuperHandle, Selector.GetHandle ("options")));
            }

            return TwoDimentionalArrayFromArrayOfNSArrays (firstDimension);
        }


        [Export ("setOptions:")]
        set {
            if (value == null)
                throw new ArgumentNullException ("value");

            var multiNSArray = NSArraysFromTwoDimentionalArray (value);

            if (IsDirectBinding) {
                ApiDefinition.Messaging.void_objc_msgSend_IntPtr (this.Handle, Selector.GetHandle ("setOptions:"), multiNSArray.Handle);
            } else {
                ApiDefinition.Messaging.void_objc_msgSendSuper_IntPtr (this.SuperHandle, Selector.GetHandle ("setOptions:"), multiNSArray.Handle);
            }
            multiNSArray.Dispose ();

        }

    }