Xamarin.ios 绑定符合协议的返回类型

Xamarin.ios 绑定符合协议的返回类型,xamarin.ios,Xamarin.ios,我正在使用用于iOS的ArcGIS运行时,我正在尝试为我正在做的一些事情设置绑定。以下是我试图绑定的类: @interface AGSTiledLayer : AGSLayer { @private id<AGSTiledLayerTileDelegate> _tileDelegate; NSOperationQueue *_operationQueue; } @property (nonatomic, assign) id<AGSTiledLayerTil

我正在使用用于iOS的ArcGIS运行时,我正在尝试为我正在做的一些事情设置绑定。以下是我试图绑定的类:

@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
当我使用有效的
AGSTile
调用
RetrieveImageAsyncForTile
时,我得到一个
InvalidCastException
表示它
无法从源类型强制转换到目标类型
。我还尝试让我的AGSTileOperation功能等同于上面的
AGSTileOperationProtocol
,但是使用了
NSOperation
BaseType
,无论是否使用
[Model]

处理方法绑定的最佳方法是什么,例如
-(NSOperation),但它们的问题似乎从未得到解决

任何帮助都将不胜感激

更新#1

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

[BaseType (typeof (NSOperation))]
interface AGSTileOperation
{}
我认为,由于它在
NSOperation
之上没有额外的属性或方法,因此应该是等效的,但它也产生了
InvalidCastException


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

我可以问一下,您尝试绑定的是哪个版本的ArcGIS iOS运行时吗?您的AGSTiledLayer接口定义与SDK中的定义完全不同;10.2中的.h文件只有一个AGSTileInfo引用和两种转换方法

在尽可能创建绑定DLL后,我目前正在尝试绑定10.1.1/10.2运行时,但我无法正确链接框架(旧的示例已过时)。请告诉我您在monotouch中使用了哪些编译器标志,以及如何设置Xamarin项目

目前正在使用XCode 4.6.2和Xamarin Studio 4.0.8(非常流行)

问候,,
弗农(Vernon)

因此,事实证明,直接绑定解决方案并不能解决问题,但根据来自的建议,我确实成功地使其工作

下面是我使用的最终绑定:

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

当然,它不像纯绑定解决方案那么干净,但它解决了我一周来一直遇到的问题。

我知道我迟到了5年,但我遇到了同样的问题,对于任何遇到它的人来说,我认为这是一个可能的解决方案:

当OP建议将此作为一种可能的约束时,他发现了一些事情:

[BaseType (typeof (NSOperation))]
interface AGSTileOperation
{}
我认为这是行不通的,因为:

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

这将创建您需要的,当然您需要更新原始方法的返回类型。在我的场景中,这对我很有效(我当时处理的是
UIViewController
)。我相信这也适用于OP-我很好奇其他更有经验的人会怎么说。

这看起来不像是答案是的,你是对的,但对我来说,上面的问题部分似乎没有“添加评论”链接。无论如何,我在做我自己的绑定时看到过这种形式的例子-我可能会遇到在某个时候也会遇到同样的问题。嘿,弗农,我绝对可以推荐一些指针。获取ObjectiveSharpie。它将为您的大多数绑定提供90%的支持。在您的
linkwith.cs
中,尝试此
linkwith
[assembly:linkwith(“libArcGIS.a”)模拟器,iCxxx=Trtrue,框架=“CaleGrand,CopeloCoCon,CordEXT,基金会,QualthCype,MealApple,MobileCoreServices,OpenGLE,安全,UIKIT”,LinkerFlags =“-LZ-AlLead Load -Objc”)
感谢您的快速响应。我在SDK安装文件夹中找不到libArcGIS.a文件;它是否嵌入了某个位置?从文档中,除非我先将其添加到项目中,否则不会生成带有.cs文件的链接。如果您查看ArcGIS.Framework,您将看到一个ArcGIS文件。复制该文件,并将其重命名为libArcGIS.a。如果您决定不这样做,请将其重命名为libArcGIS.ao坚持使用此解决方案,将RetrieveImageAsyncForTile标记为
[内部]
,并在您的
Extra.cs
文件中编写一个重载,这样您就可以保持一个整洁的API并隐藏您的IntPtr hack。@Jamie,您的绑定做得有多好?您愿意共享或发布到Xamarin Github repo吗?@ShawnKendrot:我的应用程序只关注系统的一个子集,所以我不必为ent生成绑定ire系统。我可以向我的雇主询问关于共享绑定的问题(因为这实际上是他们的要求)。在任何一种情况下,ObjectiveSharpie is都会毫不费力地让你完成90%的任务。
- (NSOperation<AGSTileOperation>*)retrieveImageAsyncForTile:(AGSTile*)tile;
[BaseType (typeof (NSOperation))]
[Protocol]
interface INSOperation : AGSTileOperation
{}