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