1

私は 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 
{}

RetrieveImageAsyncForTilevalidでを呼び出すとAGSTile、 it というInvalidCastExceptionことわざが表示されCannot cast from source type to destination typeます。また、 AGSTileOperation をAGSTileOperationProtocol上記と機能的に同等にすることも試みましたが、NSOperation BaseTypeの有無にかかわらず、 があり[Model]ます。

などのメソッドバインディングを処理する最良の方法は何- (NSOperation<AGSTileOperation>*)retrieveImageAsyncForTile:(AGSTile*)tile;ですか?

Monotouchバインディングに似たいくつかの代替手段を試しました-「ソースタイプから宛先タイプにキャストできません。」、しかし、彼らの問題は決して解決されたようには見えませんでした。

どんな助けでも大歓迎です。

更新 #1

の戻り値の型をRetrieveImageAsyncForTileからAGSTileOperationに変更するNSOperationと、適切に返されますが、追加の (必須) プロパティが欠落しています。これにより、追加の洞察が得られると思われる別のアイデアが得られましたが、驚いたことに、失敗する可能性はないと思っていたにもかかわらず、実際に成功しました。

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

の上に追加のプロパティやメソッドがないため、NSOperation同等であるはずですが、InvalidCastException.

うまくいけば、誰かがこれを回避する方法を知っていますか?

4

3 に答える 3

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 週間抱えていたこの問題は解決しました。

于 2013-06-07T03:22:57.353 に答える
-1

バインドしようとしている ArcGIS iOS ランタイムのバージョンをお尋ねしてもよろしいですか? AGSTiledLayer インターフェイスの定義は、SDK にあるものとはまったく異なります。10.2 の .h ファイルには、AGSTileInfo 参照と 2 つの変換メソッドしかありません。

現在、可能な限りバインド DLL を作成した後、10.1.1/10.2 ランタイムをバインドしようとしていますが、フレームワークを適切にリンクできません (古いサンプルは古くなっています)。使用したコンパイラ フラグを教えてください。 Xamarin プロジェクトをどのようにセットアップしたのですか?

現在、XCode 4.6.2 および Xamarin Studio 4.0.8 (かなり最新) を使用しています。

よろしく、バーノン

于 2013-06-07T02:20:14.300 に答える