1

これは奇妙です。という UITextView コントロールがtxtNotesあり、イベントを消費したいScrolledので、次のようにします。

txtNotes.Scrolled += (object sender, EventArgs e) => 
{
    "Scrolled".Debug();
};

そして、これはうまくいきます。デバッグ メッセージは期待どおりに出力されます。UIScrollViewしかし、UITextViewから継承するに何かをするヘルパー関数があります。だから私はこれと同等のことをしています:

UIScrollView uv = txtNotes;

uv.Scrolled += (object sender, EventArgs e) => 
{
    "Scrolled".Debug();
};

そして、これは機能しません: イベントハンドラーは呼び出されません。そして、他の場所では、タイプのコントロールUIScrollView(から継承するタイプではありませんUIScrollView)があり、そこからイベントを取得できますしたがって、サブクラスが基本クラスとして型付けされている場合、基本クラスのイベントはサブクラスで発生しないようです。

これは私には何の意味もありません.Monotouchまたはおそらく基盤となるiOSのバグのように感じます. 誰でもこれを確認できますか、または私が間違っていることと、それを修正/回避する方法を教えてもらえますか?

4

1 に答える 1

1

簡単な答えはそれがUITextView提供することです:

public new event EventHandler Scrolled

newキーワードは基本イベントを非表示にし、UIScrollView.Scrolled2つの別々の実装にします。IOWを設定すると、もう一方は設定されません。これが.NETの仕組みです。

しかし、なぜそこにあるのnewですか?理由は少し複雑です。*Delegate強く型付けされたイベントを提供するには、グルーコードとして内部型を作成する必要があります。これは99%の時間はうまく機能しますが、いくつかの欠点があります。

この場合、 aまたはanを使用すると、内部*Delegateタイプは同一になりません。継承は使用できませんでした(そして、その理由は今夜私の心から逃れます:-)。UIScrollViewUITextView

[Weak]Delegateしかし、プロパティの使用が機能しなかったことに驚いています。理由はわかりますが、同じnewですが、理由を思い出せません...調査する必要があります:)

于 2013-03-06T01:13:07.657 に答える