为什么不控制事件在基接口上触发?

时间:2013-03-03 15:29:49

标签: ios xamarin.ios

这个很奇怪。我有一个名为txtNotes的UITextView控件,我想要消耗Scrolled个事件,所以我这样做:

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

这很好用;调试消息按预期打印。但是我有一个辅助函数,可以对UIScrollView执行某些操作,UITextView继承自UIScrollView uv = txtNotes; uv.Scrolled += (object sender, EventArgs e) => { "Scrolled".Debug(); }; 。所以我做的相当于:

UIScrollView

不工作:永远不会调用事件处理程序。在其他地方我控制了UIScrollView类型( NOT 一种继承自{{1}}的类型),而我 CAN 从中获取事件。因此,当类型作为基类时,基类事件似乎不会触发。

这对我来说没有任何意义,而且真的感觉像是Monotouch或底层iOS中的错误。任何人都可以证实这一点,或告诉我我做错了什么,以及如何解决/解决它?

1 个答案:

答案 0 :(得分:1)

简短的回答是UITextView提供:

public new event EventHandler Scrolled

new 关键字会隐藏基本UIScrollView.Scrolled事件 - 使它们成为两个独立的实现。 IOW如果你设置一个然后另一个没有设置。这就是.NET的工作方式。

但为什么会有 new ?原因有点复杂。只有通过创建内部*Delegate类型作为粘合代码,才能提供强类型事件。这种方法在99%的情况下运行良好,但有一些drawbacks

在这种情况下,如果使用*DelegateUIScrollView,则内部UITextView类型将不相同 - 并且无法使用继承(并且它的原因会逃脱我的今晚记住: - )。

然而,我很惊讶使用[Weak]Delegate属性不起作用。我知道为什么,它是相同的 new ,但我不记得这个的原因......需要调查:)