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 文本不会立即更改的主要内容,如果未能解决你的问题,请参考以下文章