Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么不';t控制事件在基础接口上触发?_Ios_Xamarin.ios - Fatal编程技术网

Ios 为什么不';t控制事件在基础接口上触发?

Ios 为什么不';t控制事件在基础接口上触发?,ios,xamarin.ios,Ios,Xamarin.ios,这个很奇怪。我有一个名为txtNotes的UITextView控件,我想使用滚动的事件,所以我这样做: txtNotes.Scrolled += (object sender, EventArgs e) => { "Scrolled".Debug(); }; 这很好用;调试消息按预期打印。但是我有一个helper函数,它对UIScrollView做了一些事情,而UITextView继承自。所以我做了与此等效的工作: UIScrollView uv = txtNotes; uv

这个很奇怪。我有一个名为
txtNotes
的UITextView控件,我想使用
滚动的事件,所以我这样做:

txtNotes.Scrolled += (object sender, EventArgs e) => 
{
    "Scrolled".Debug();
};
这很好用;调试消息按预期打印。但是我有一个helper函数,它对
UIScrollView
做了一些事情,而
UITextView
继承自。所以我做了与此等效的工作:

UIScrollView uv = txtNotes;

uv.Scrolled += (object sender, EventArgs e) => 
{
    "Scrolled".Debug();
};
而这个不起作用:永远不会调用事件处理程序。在其他地方,我有一个
UIScrollView
类型的控件(不是继承自
UIScrollView
的类型),我可以从中获取事件。因此,当子类被类型化为基类时,基类事件似乎不会激发子类


这对我来说毫无意义,感觉就像Monotouch或底层iOS中的一个bug。有人能证实这一点,或者告诉我我做错了什么,以及如何修复/解决它吗?

简短的回答是,
UITextView
提供了:

public new event EventHandler Scrolled
new
关键字隐藏基本的
UIScrollView.Scrolled
事件-使它们成为两个独立的实现。如果设置了一个,则另一个未设置。这就是.NET的工作原理

但是为什么会有新的
?原因有点复杂。只有通过创建内部
*委托
类型作为粘合代码,才能提供强类型事件。这在99%的情况下都很有效,但也有一些问题

在这种情况下,如果使用了
UIScrollView
UITextView
,则内部
*委托类型将不相同,并且无法使用继承(今晚我想不出它的原因:-)


但是,我很惊讶使用
[Weak]委托
属性不起作用。我明白为什么了,这是相同的
新的
,但我想不起来这是什么原因了。。。需要调查:)

简单的回答是,
UITextView
提供:

public new event EventHandler Scrolled
new
关键字隐藏基本的
UIScrollView.Scrolled
事件-使它们成为两个独立的实现。如果设置了一个,则另一个未设置。这就是.NET的工作原理

但是为什么会有新的
?原因有点复杂。只有通过创建内部
*委托
类型作为粘合代码,才能提供强类型事件。这在99%的情况下都很有效,但也有一些问题

在这种情况下,如果使用了
UIScrollView
UITextView
,则内部
*委托类型将不相同,并且无法使用继承(今晚我想不出它的原因:-)


但是,我很惊讶使用
[Weak]委托
属性不起作用。我明白为什么了,这是相同的
新的
,但我想不起来这是什么原因了。。。需要调查:)

替代使用C#事件,等效的
UIScrollViewDelegate
是否有效?我刚刚尝试了与您的示例完全相同的方法,效果非常好。你在使用旧版本的MonoTouch吗?@jonathanpeppers:不,我也有同样的想法。委托在附加到UITextView时有效,但在附加到UIScrollView的同一对象时无效。@Blounty:我使用的是旧版本,但只是为了确保升级到最新的Xamarin Studio,仍然存在问题。你有你使用的源代码吗?这样我就可以看到可能有什么不同了?那么你可以直接转换到
UITextView
并开始工作吗?我怀疑这可能与下面的MonoTouch实现细节有关。与其使用C#事件,不如使用等效的
UIScrollViewDelegate
。我刚刚尝试了与您的示例完全相同的方法,效果非常好。你在使用旧版本的MonoTouch吗?@jonathanpeppers:不,我也有同样的想法。委托在附加到UITextView时有效,但在附加到UIScrollView的同一对象时无效。@Blounty:我使用的是旧版本,但只是为了确保升级到最新的Xamarin Studio,仍然存在问题。你有你使用的源代码吗?这样我就可以看到可能有什么不同了?那么你可以直接转换到
UITextView
并开始工作吗?我怀疑这可能是MonoTouch实现细节的问题。感谢您的详细解释。现在我明白发生了什么,我没有疯。但现在我不知道如何解决这个问题。能够编写在任何基类型实例上工作的代码,而不必为UIScrollView、UITextView、UIWebView等编写不同的版本,这会更简洁。您能否建议一种策略,以干净的方式处理此事件/委托问题?我正在研究这一点。。。将在几次测试后更新我的答案。谢谢您的详细解释。现在我明白发生了什么,我没有疯。但现在我不知道如何解决这个问题。能够编写在任何基类型实例上工作的代码,而不必为UIScrollView、UITextView、UIWebView等编写不同的版本,这会更简洁。您能否建议一种策略,以干净的方式处理此事件/委托问题?我正在研究这一点。。。将在几次测试后更新我的答案。