点击按钮后立即禁用与不同 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