1

我正在使用适用于 iOS 的 ArcGIS Runtime,并且正在尝试为我正在做的一些事情设置绑定。这是我要绑定的类:

@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 绑定的替代方案——“无法从源类型转换为目标类型”。,但他们的问题似乎从未得到解决。

任何帮助将不胜感激。

更新#1

如果我将RetrieveImageAsyncForTilefrom的返回类型更改AGSTileOperationNSOperation它会正确返回,并且不会失败,但缺少附加(必需)属性。这给了我另一个想法,我认为它可能会产生一些额外的见解,但令我惊讶的是,尽管我认为它不可能失败,但它确实失败了。

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

我认为,由于它NSOperationInvalidCastException.

希望有人知道我该如何解决这个问题?

4

3 回答 3

1

所以事实证明,直接绑定解决方案并没有解决问题,但是根据Xamarin 论坛的建议,我确实设法让它工作。

所以这是我使用的最终绑定:

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

当然,它没有纯绑定解决方案那么干净,但它解决了我一个星期以来一直存在的这个问题。

于 2013-06-07T03:22:57.353 回答
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 - 我很好奇其他更有经验的人会对此说些什么。

于 2018-04-18T22:06:03.153 回答
-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(相当最新)

问候,弗农

于 2013-06-07T02:20:14.300 回答