2017-03-31 12 views
0

デリゲートメソッドでEventArgs属性を使用すると、最初のものを除くメソッドパラメータに基づいたプロパティを持つイベントハンドラクラスが生成されます。Xamarin iOS EventArgsに最初のプロパティがありません。

生成されたイベントargsクラスに最初のパラメータがありません。例えば

[Protocol, Model] 
[BaseType(typeof(NSObject))] 
public interface TestDelegate 
{ 
    // @required -(void)DidReceiveFrom:(NSString * _Nonnull)p1 withP2:(NSString * _Nonnull)p2 withP3:(NSString * _Nonnull)p3 withP4:(NSString * _Nonnull)p4; 
    [Abstract] 
    [Export("DidReceiveFrom:withP2:withP3:withP4:")] 
    [EventArgs("DidReceiveFrom")] 
    void DidReceiveFrom(string p1, string p2, string p3, string p4); 

そして、生成されたのEventArgsクラスは次のようになります。だから、それは間違いなく、P1プロパティを行方不明

// 
// EventArgs classes 
// 
public partial class DidReceiveFromEventArgs : EventArgs { 
    public DidReceiveFromEventArgs (string p2, string p3, string p4) 
    { 
     this.p2 = p2; 
     this.p3 = p3; 
     this.p4 = p4; 
    } 
    public string p2 { get; set; } 
    public string p3 { get; set; } 
    public string p4 { get; set; } 
} 

。この動作を回避する方法は?

答えて

0

Xamarinのドキュメントによると、この動作がデフォルトである:複数のパラメータを取るイベントの場合

(Objective-Cで大会が委譲クラスの最初のパラメータは、のインスタンスであるということです送信者オブジェクト)を生成するには、生成されるEventArgsクラスの名前を指定する必要があります。これは、Modelクラスのメソッド宣言のEventArgs属性で行います。

https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#EventArgsAttribute

そうです、私はバインディングを生成しているため、ソースライブラリ内の代表者は、厳密にこのルールに従わないと、最初のパラメータが文字列形式で半送信者であると思われます。

0

objective sharpieツールを使用して、Objective C API用のC#コードを生成していると思います。

もしそうなら、基本的にはヘルパーツールだが100%保証されていないことを覚えておく必要があります。正しいC#コードが得られます。

それにかかわらず、修正する最も簡単な方法は、C#コードを手動で編集し、それを見逃した場合にこのパラメータを追加することです。

あなたはTestDelegateのC#コードを表示していません。あなたは送信者としての最初のパラメータを持っているかもしれないし、イベント引数として3つの他のすべてのパラメータを持っているかもしれませんか?

この場合、C#APIの[EventArgs("DidReceiveFrom")]属性をコメントし、バインディングを再コンパイルします。

+0

これはiOSバインディングプロジェクトですので、上記のサンプルコードからC#デリゲートコードが生成されます。デリゲートを編集して最初のパラメータとして送信者を使用したり使用したりすることはできません。私はちょうどC#イベントを使用し、EventArgsクラスのすべてのパラメータを持っていて、送信者は最初のイベントargsプロパティではなく、実際の送信者オブジェクトを含む必要があります。 – awattar

+0

@awattarこのC#コードを書くか、objcファイルから生成しましたか? –

+0

コードはsharpieツールで生成されましたが、強力または弱い代理人の代わりにC#イベントを使用したいのでEventArgs属性を追加しました。デリゲートメソッドから生成された最初のプロパティが、ライブラリEventArgsクラスをバインドして生成されたものであることを除いて、すべて正常に動作します。 – awattar

関連する問題