2015-02-23 5 views
0

Я пытаюсь связать свойство, которое я знаю как (многомерное) NSArray, содержащий NSArray объекты, которые в свою очередь содержат экземпляры NSObject. Я связала метод как таковой:Связывание многомерных массивов в Xamarin

[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<Foundation.NSObject[]>:

(1) Error CS0311: The type `Foundation.NSObject[]' cannot be used as type parameter `T' in the generic type or method `Foundation.NSArray.ArrayFromHandle<T>(System.IntPtr)'. There is no implicit reference conversion from `Foundation.NSObject[]' to `ObjCRuntime.INativeObject' (CS0311) 

держать ссылаясь на неспособность компиляторов для преобразования между Foundation.NSObject[][] и Foundation.NSObject[] Ошибки. Я не понимаю, почему это будет проблемой, NSArray является подклассом NSObject, поэтому почему он не может обрабатывать измерение второго массива как NSObject?

(я знаю, что есть альтернативы, такие как связующие параметры, как NSObject[], или просто NSObject, но я предпочел бы быть как тип безопасной, насколько это возможно.)

ответ

0

Я думаю, что эта проблема возникает из-за методов FromNSObjects и ArrayFromHandle не могут обрабатывать преобразование многомерных массивов, но я не совсем уверен.

Мне удалось обойти эту проблему, удалив привязку Options из моего файла привязок (ApiDefinition.cs) и вручную привязав свойство в частичном классе.

Я написал два метода для преобразования между многомерными 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; 
    } 

Затем я использовал вышеуказанные методы преобразования для реализации моих привязок.

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(); 

     } 

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