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.Scrolled——使它们成为两个独立的实现。IOW 如果你设置了一个,那么另一个没有设置。这就是.NET 的工作方式。

但是为什么会有一个new?原因有点复杂。只有通过将内部*Delegate类型创建为胶水代码才能提供强类型事件。这在 99% 的情况下效果很好,但也有一些缺点

在这种情况下,如果使用 a或 an,则内部*Delegate类型将不相同- 并且无法使用继承(今晚我忘记了它的原因:-)。UIScrollViewUITextView

但是我很惊讶使用[Weak]Delegate属性不起作用。我明白为什么,它是一样的new,但我不记得这个原因......需要调查:)

于 2013-03-06T01:13:07.657 回答