2013-06-03 2 views
0

Я работаю с ArcGIS Runtime для iOS, и я пытаюсь настроить привязку для некоторых вещей, которые я делаю. Вот классы я пытаюсь связать:Привязка к типу возврата, который соответствует протоколу

@interface AGSTiledLayer : AGSLayer { 
@private 
    id<AGSTiledLayerTileDelegate> _tileDelegate; 
    NSOperationQueue *_operationQueue; 
} 

@property (nonatomic, assign) id<AGSTiledLayerTileDelegate> tileDelegate; 

@property (nonatomic, retain, readonly) NSOperationQueue *operationQueue; 

@property (nonatomic, retain, readonly) AGSTileInfo *tileInfo; 

- (NSOperation<AGSTileOperation>*)retrieveImageAsyncForTile:(AGSTile*)tile; 

@end 



@protocol AGSTileOperation <NSObject> 

@property (nonatomic, retain) AGSTile *tile; 

@end 

Основываясь на них, я сгенерировал следующих Классы привязки

[BaseType (typeof (AGSLayer))] 
interface AGSTiledLayer { 

    [Export ("tileDelegate")] 
    AGSTiledLayerTileDelegate TileDelegate { get; set; } 

    [Export ("operationQueue")] 
    NSOperationQueue OperationQueue { get; } 

    [Export ("tileInfo")] 
    AGSTileInfo TileInfo { get; } 

    [Export ("retrieveImageAsyncForTile:")] 
    AGSTileOperation RetrieveImageAsyncForTile (AGSTile tile); 
} 

[BaseType (typeof (NSObject))] 
[Model] 
interface AGSTileOperationProtocol { 

    [Export ("tile")] 
    AGSTile Tile { get; set; } 
} 

[BaseType (typeof (NSOperation))] 
interface AGSTileOperation : AGSTileOperationProtocol 
{} 

Когда я называю RetrieveImageAsyncForTile с действительным AGSTile, это я получаю InvalidCastException говоря, что это Cannot cast from source type to destination type. Я также попробовал просто иметь свой AGSTileOperation, функционально эквивалентный AGSTileOperationProtocol выше, но с NSOperationBaseType, как с [Model], так и без него.

Каков наилучший способ справиться с привязками метода, например - (NSOperation<AGSTileOperation>*)retrieveImageAsyncForTile:(AGSTile*)tile;?

Я пробовал несколько альтернатив, подобных Monotouch binding - "Cannot cast from source type to destination type.", но их проблема никогда не была решена.

Любая помощь была бы принята с благодарностью.

Update # 1

Если изменить тип возвращаемого RetrieveImageAsyncForTile от AGSTileOperation к NSOperation возвращается правильно, и в обязательном порядке, но отсутствует свойство дополнительного (требуется). Это дало мне еще одну идею, которая, как я думал, может дать некоторое дополнительное понимание, но, к моему удивлению, несмотря на то, что я думал, что это невозможно, это произошло.

[BaseType (typeof (NSOperation))] 
interface AGSTileOperation 
{} 

Что я понял, так как она не имеет дополнительных свойств или методов поверх NSOperation, должны быть эквивалентны, но это тоже давшие InvalidCastException.

Надеюсь, у кого-то есть представление, как я могу обойти это?

ответ

-1

Могу ли я спросить, какую версию среды выполнения ArcGIS iOS вы пытаетесь связать? Определение интерфейса AGSTiledLayer не похоже на то, что находится в SDK; файл .h в 10.2 имеет только ссылку AGSTileInfo и 2 метода преобразования.

В настоящее время я пытаюсь связать 10.1.1/10.2 время выполнения после создания связующей DLL как можно лучше, но я не могу правильно связать структуру (старый образец устарел.) Не могли бы вы сообщить мне, какой компилятор флаги, которые вы использовали в monotouch, и как вы создали свой проект Xamarin?

В настоящее время с помощью XCode 4.6.2 и Xamarin студия 4.0.8 (довольно ток)

С уважением, Вернон

+0

Это не похоже на ответ – smerny

+0

Да, вы правы, но для меня не существует ссылки «Добавить комментарий» в разделе вопросов выше. В любом случае, я видел экземпляры этой формы при выполнении моей собственной привязки - я, вероятно, столкнусь с той же проблемой в какой-то момент. –

+0

Эй, Вернон, я определенно рекомендую некоторые указатели. Получите ObjectiveSharpie. Это даст вам 90% пути на большинстве ваших привязок. В вашей 'linkwith.cs' попробуйте этот' LinkWith' '[сборка: LinkWith (« libArcGIS.a », LinkTarget.ArmV6 | LinkTarget.ArmV7 | LinkTarget.Simulator, IsCxx = true, ForceLoad = true, Frameworks =" CoreGraphics, CoreLocation, CoreText, Foundation, QuartzCore, MediaPlayer, MobileCoreServices, OpenGLES, Security, UIKit ", LinkerFlags =" -lz -all_load -ObjC ")]' –

0

Так получилось, что прямой привязки решение не решить эту проблему, но с предложение от Xamarin Forums, мне удалось заставить его работать.

Так вот переплетный я использовал:

[BaseType (typeof (AGSLayer))] 
interface AGSTiledLayer { 

    [Export ("tileDelegate")] 
    AGSTiledLayerTileDelegate TileDelegate { get; set; } 

    [Export ("operationQueue")] 
    NSOperationQueue OperationQueue { get; } 

    [Export ("tileInfo")] 
    AGSTileInfo TileInfo { get; } 

    [Export ("retrieveImageAsyncForTile:")] 
    IntPtr RetrieveImageAsyncForTile (AGSTile tile); 
} 

[BaseType (typeof (NSOperation))] 
interface AGSTileOperation { 

    [Export ("tile")] 
    AGSTile Tile { get; set; } 
} 

Теперь здесь, где мы можем использовать его.

IntPtr op = agsTiledLayer.RetrieveImageAsyncForTile(tile); 
AGSTileOperation aop = new AGSTileOperation(op); 

Конечно, это не так чист, как чистый обязывающего решения, но решить эту проблему, которая у меня были в течение недели.

+0

Если вы решите придерживаться этого решения, пометьте RetrieveImageAsyncForTile как '[Internal]' и напишите перегрузку в файле 'Extra.cs', чтобы сохранить чистый API и скрыть свой взлом IntPtr. –

+0

@ Jamie, Как далеко вы получили свои привязки? Готовы ли вы поделиться или отправить в репозиторий Xamarin Github? –

+0

@ShawnKendrot: мое приложение фокусируется только на подмножестве системы, поэтому мне не нужно создавать привязки для всей системы. Я мог бы проверить с моим работодателем о совместном использовании привязок (поскольку это действительно их призыв). В любом случае, ObjectiveSharpie получит вам 90% от всего этого с небольшими усилиями. –

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