【问题标题】:Disable user interaction with different ui elements immediately after tapping on a button点击按钮后立即禁用与不同 ui 元素的用户交互
【发布时间】:2026-01-10 23:50:01
【问题描述】:

我需要在用户点击按钮后立即禁用与其他 ui 元素的所有用户交互。我想防止用户一次触发多个操作,例如按下按钮并点击集合视图中的元素或点击 UIBackBarButton。

例如,我创建了一个调用此方法的 UIBarButtonItem,它禁用 self.view 和 UIBarButtonItems 的用户交互,并在 1 秒后重新启用它们:

- (void)buttonPressed:(id)sender
{
    self.view.userInteractionEnabled = NO;
    self.navigationItem.backBarButtonItem.enabled = NO;
    self.navigationItem.rightBarButtonItem.enabled = NO;

// ... show an alert view

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        self.view.userInteractionEnabled = YES;
        self.navigationItem.backBarButtonItem.enabled = YES;
        self.navigationItem.rightBarButtonItem.enabled = YES;
    });

}

问题是,如果我几乎同时点击此按钮和例如后退按钮,它会显示警报视图并弹出当前视图控制器。 我假设它会等待几毫秒来确定此事件是单点触摸还是多点触摸事件(例如双击),但我不知道如何处理。

如何在用户点击此按钮后立即禁用用户交互?

【问题讨论】:

  • 我相信你的行动是在UIControlEventTouchUpInside 。转至UIControlEventTouchDown
  • 您好,感谢您的回答。我在示例的描述中犯了一个小错误。我实际上创建了一个 UIBarButtonItem 来调用这个方法。而且这不是 UIControl 的继承,所以没有办法改变 UIControlEvents。我更新了问题。
  • 我的答案仍将保持不变。创建uibarbutton as uibutton as shown here。现在对于 uibutton,将事件发送到 UIControlEventTouchDown。你完成了:)
  • 我认为问题在于self.navigationItem.backBarButtonItem 没有动作或目标,它只是为了外观,您应该创建一个self.navigationItem.leftBarButtonItem 并在您触摸按钮时禁用它。

标签: ios objective-c uibutton touch-event


【解决方案1】:

UIAlertView 的出现应该会阻止进一步的用户交互。不过,您是说有一个非常短的窗口(“几毫秒”是用户感知的微小延迟),用户可以在其中触摸其他按钮,并导致奇怪的行为。好的,无需测试,我会认为这是真的。

执行此操作的一种相当暴力的方法是在相关按钮上将exclusiveTouch 设置为YES。有关完整说明,请参阅Event Handling Guide。基本上,当exclusiveTouch 属性为YES 的视图正在跟踪触摸时,没有其他视图可以跟踪触摸。同样,除非没有其他视图正在跟踪触摸,否则此类视图可能不会开始跟踪触摸。

旁注:我认为您正在使用dispatch_after 将块放入主队列。通常,如果您打算将某些内容放在主队列中以立即执行,则只需使用 dispatch_async

编辑:当这个问题被问到时,它没有指定使用UIBarButtonItem。此答案仅适用于 UIView 或其后代。

【讨论】:

  • 你说得对,我很抱歉。但即便如此,你的回答对我帮助很大。谢谢你。