点击按钮后立即禁用与不同 ui 元素的用户交互

Posted

技术标签:

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

我需要在用户点击按钮后立即禁用与其他 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 并在您触摸按钮时禁用它。 【参考方案1】:

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

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

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

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

【讨论】:

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

以上是关于点击按钮后立即禁用与不同 ui 元素的用户交互的主要内容,如果未能解决你的问题,请参考以下文章

如何在第一次提交(在客户端)后立即禁用 ASP.NET 按钮?

两个不同的按钮对同一个视图控制器执行 segue,但希望通过一个按钮禁用用户交互以进行 segue

如何取消并从UIAlertView调用用户操作

form元素的()属性指出“提交”按钮被点击后跳转到哪个网页

UIButton 禁用状态不会立即改变

如何在 android 视图上禁用所有用户输入(点击、触摸)