我正在使用ArcGIS Runtime for 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
,但使用NSOperation
BaseType
,无论有无[Model]
。
处理方法绑定的最佳方法是什么,例如- (NSOperation<AGSTileOperation>*)retrieveImageAsyncForTile:(AGSTile*)tile;
?
我尝试了一些类似于Monotouch binding - "Cannot cast from source type to destination type."的替代方案,但他们的问题似乎从未得到解决。
非常感谢任何帮助。
更新#1
如果我将RetrieveImageAsyncForTile
的返回类型从AGSTileOperation
更改为NSOperation
,则会正确返回,但不会失败,但会遗漏其他(必需)属性。这给了我另一个想法,我认为可能会产生一些额外的见解,但令我惊讶的是,尽管我认为它不可能失败,但确实如此。
[BaseType (typeof (NSOperation))]
interface AGSTileOperation
{}
我认为,由于NSOperation
之上没有其他属性或方法,因此应该是等效的,但它也产生了InvalidCastException
。
希望有人知道如何解决这个问题?
答案 0 :(得分:1)
所以事实证明直接绑定解决方案并没有解决问题,但是根据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);
当然,它不像纯粹的绑定解决方案那么干净,但它解决了我已经有一个星期的问题。
答案 1 :(得分:0)
我知道我已经晚了5年但是我遇到了同样的问题,对于遇到它的人来说 - 我认为这是一个可能的解决方案:
当他建议将其作为一种可能的约束时,OP正在寻找一些东西:[BaseType (typeof (NSOperation))]
interface AGSTileOperation
{}
我相信这不起作用,因为:
- (NSOperation<AGSTileOperation>*)retrieveImageAsyncForTile:(AGSTile*)tile;
返回符合AGSTileOperation的NSOperation(不是相反) - Objective-C专家,如果我在这里错了,请打电话给我......
据说,解决方案是在绑定中创建以下骨架界面:
[BaseType (typeof (NSOperation))]
[Protocol]
interface INSOperation : AGSTileOperation
{}
然后,您将创建所需的内容,当然您需要更新原始方法的返回类型。这在我的场景中对我有用(我正在处理UIViewController
)。我相信这也适用于OP--我很好奇其他更有经验的人会对此说些什么。
答案 2 :(得分:-1)
请问您要尝试绑定哪个版本的ArcGIS iOS运行时?您的AGSTiledLayer接口定义与SDK中的内容完全不同; 10.2中的.h文件只有一个AGSTileInfo引用和2个转换方法。
我正在尝试尽可能地创建绑定DLL之后绑定10.1.1 / 10.2运行时,但是我无法正确链接框架(旧样本已过时。)请您告诉我什么编译器标记你在monotouch中使用过,以及你如何设置你的Xamarin项目?
目前正在使用XCode 4.6.2和Xamarin Studio 4.0.8(非常流行)
此致 弗农