这个很奇怪。我有一个名为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中的错误。任何人都可以证实这一点,或告诉我我做错了什么,以及如何解决/解决它?
答案 0 :(得分:1)
简短的回答是UITextView
提供:
public new event EventHandler Scrolled
new
关键字会隐藏基本UIScrollView.Scrolled
事件 - 使它们成为两个独立的实现。 IOW如果你设置一个然后另一个没有设置。这就是.NET的工作方式。
但为什么会有 new
?原因有点复杂。只有通过创建内部*Delegate
类型作为粘合代码,才能提供强类型事件。这种方法在99%的情况下运行良好,但有一些drawbacks。
在这种情况下,如果使用*Delegate
或UIScrollView
,则内部UITextView
类型将不相同 - 并且无法使用继承(并且它的原因会逃脱我的今晚记住: - )。
然而,我很惊讶使用[Weak]Delegate
属性不起作用。我知道为什么,它是相同的 new
,但我不记得这个的原因......需要调查:)