iOS:如果您长按然后释放它,UIButton 文本不会立即更改

Posted

技术标签:

【中文标题】iOS:如果您长按然后释放它,UIButton 文本不会立即更改【英文标题】:iOS: UIButton text doesn't immediately change if you long press then release it 【发布时间】:2012-12-19 16:13:25 【问题描述】:

我的目标是 ios 5.1 并使用情节提要。我在 UITableViewCell 中有一个 UIButton,当点击它时,它会调用“Touch Up Inside”方法,调用 Web 服务,然后在完成处理程序中,通过调用一个为所有按钮状态设置文本的函数来更新 UIButton 的文本像这样:

+(void) setButtonText:(NSString *)text forButton:(UIButton *)button

    [button setTitle:text forState:UIControlStateNormal];
    [button setTitle:text forState:UIControlStateDisabled];
    [button setTitle:text forState:UIControlStateHighlighted];
    [button setTitle:text forState:UIControlStateSelected];

如果你只是点击按钮效果很好,但是如果你长按它然后释放,Web 服务调用和完成处理程序会被调用并立即返回,但是在按钮上的文本更新之前大约需要 5 秒。我尝试在按钮和 self.view 上调用 setNeedsDisplay。当有人长按+发布时,我可以如何让文本立即更新?

【问题讨论】:

【参考方案1】:

您不一定需要检测长按,只需更改按钮触发选择器的状态即可。如果您以编程方式执行此操作,则应该有这样的内容:

[self.myButton addTarget:self action:@selector(mySelector) forControlEvents:UIControlEventTouchDown];

在 XIB/Storyboard 中,该选项在“Touch Down”下的调色板中可用:

这会导致选择器在触摸按钮时立即被触发,而不是我可以假设的设置为UIControlEventTouchUpInside,在该设置中,当触摸在按钮附近结束时发送事件。

【讨论】:

虽然这是一个很好的解决方法(可能是解决方案?),但我仍然很好奇为什么按钮文本更新前会有 5 秒的延迟。 @Alphatrak 我最好的猜测是您正在使用阻塞网络操作,这意味着您的 UI 在主线程被解除阻塞之前无法更新(或者,因此,当您的网络请求完成时)。 【参考方案2】:

发现问题。我在 completionHandler 中设置按钮文本,它运行一个与 UI 线程不同的线程。因此,延迟 5 秒的奇怪未定义行为。解决方法是调用...

[self performSelectorOnMainThread:@selector(receivedData:) withObject:result waitUntilDone:YES];

...然后在“receivedData”方法中调用setButtonText。

在 UI 上更新内容的黄金法则是在 UI 线程中更新。

显然,如果我在我的问题中发布了更多代码,您就会看到这一点。对于那个很抱歉。至少吸取了教训。

【讨论】:

以上是关于iOS:如果您长按然后释放它,UIButton 文本不会立即更改的主要内容,如果未能解决你的问题,请参考以下文章

UIButton长按做动画,松开时动画停止[关闭]

长按多次调用 UIButton 的动作

按下shift,然后自动向上?(避免长按)

如何检测“长按”

UIbutton 长按和 Touch Up 里面

在 iOS14 上释放 wkwebview 时,发送手势事件导致崩溃