是否可以阻止触摸被添加到队列中?

Posted

技术标签:

【中文标题】是否可以阻止触摸被添加到队列中?【英文标题】:Is it possible to stop touches from getting added to the queue? 【发布时间】:2009-08-15 22:07:28 【问题描述】:

我在我的主视图(其中包含一些我用作按钮的子视图)中禁用了交互。

当我有一个辅助视图显示网络活动(加载数据)时,我保持禁用此功能。完成后,我会在主视图中重新启用交互。

这样用户在网络操作发生时不会点击这些按钮。

无论如何,一切看起来都很好,但是如果用户开始在主视图中点击按钮,一旦重新启用,这些触摸事件(从过去几秒钟开始)实际上会触发。不是 touches-begin,它突出显示按钮,而是在 touches-end 时调用的函数。就像它在被禁用的整个过程中都在排队,并且“竞相追赶”。

很奇怪,为什么在视图禁用用户交互的情况下触摸事件会排队?

【问题讨论】:

【参考方案1】:

不看代码就很难确定答案,但这里有一个想法:

如果您的网络活动是同步的,也就是阻塞,那么可能是用户的触摸在他们有机会点击您的任何代码之前就已排队。如果是这种情况,那么在网络活动完成之前,这些触摸不会发送到您的响应者链中,并且他们永远不会有机会“知道”您已禁用与这些控件的交互。

这里有一种方法可以帮助您调试您的情况:在顶层(您称为辅助视图)中添加一些调试NSLog 语句,以指示网络活动。确保辅助视图的框架足够大以包含这些触摸,并查看它是否会在触摸发生时立即记录这些触摸。如果不是,我的猜测可能是正确的。如果是,那么您仍然可以获得有用的信息 - 而且您可能能够简单地捕获此级别的触摸,而不是让它们排队。

如果这个猜测是正确的,我能想到的最简单的解决方法就是让你的网络操作异步。

如果您不想这样做,您也可以尝试使用NSTimer 在同步调用完成后让网络活动指示器保持亮起一秒钟。这样,您的响应链可以清除传入触摸的队列,如果这是所需的行为,则忽略它们。

【讨论】:

+1 出色的洞察力。当你的答案突然出现时,我正在写一个冗长的答案,我立即将其丢弃,因为相比之下,我的观点似乎非常狭隘。如果可以的话,我会更多地投票给你。 谢谢,戴夫!我希望它对迈克尔有用。 谢谢,我真的不知道问题出在哪里。基本上,这是一个被禁用的背景视图,以及一个指示网络活动的模式窗口。我先禁用背面。它是 XML 数据的异步加载。加载数据后,我将删除模态窗口,并在后台重新启用交互。无论如何,我绝对没有得到所有的触摸,并且禁用交互似乎在大多数情况下都有效。但是,如果我在数据完成加载后的 如果 userInteractionEnabled=NO,这是否应该阻止所有触摸排队?

以上是关于是否可以阻止触摸被添加到队列中?的主要内容,如果未能解决你的问题,请参考以下文章

队列项结果返回给调用api调用的成员

在触摸时将动画添加到 SKSpriteNode (Swift)

是否可以阻止 requireJS 自动添加 .js 文件扩展名?

事件的产生,传递以及响应链

如何阻止 UIScrollView 吞下触摸

iOS之事件的传递和响应机制-原理篇