绑定符合协议的返回类型

时间:2013-06-03 22:35:01

标签: xamarin.ios

我正在使用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时,我会InvalidCastExceptionCannot 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

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

3 个答案:

答案 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(非常流行)

此致 弗农