2

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

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

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

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

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

4

1 回答 1

4

如果没有看到代码,很难对这里的答案充满信心,但这里有一个想法:

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

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

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

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

于 2009-08-15T22:32:03.393 回答