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

3

我正在针对iOS 5.1版本进行开发,并使用故事板(storyboard)。我在一个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。你有什么办法可以让文本在长按+释放时立即更新吗?
2个回答

1

您不一定需要检测长按事件,而是需要改变按钮触发选择器的状态。如果您正在以编程方式实现此功能,应该有类似以下代码:

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

在 XIB/Storyboard 中,在调色板中的“Touch Down”下提供了该选项。

enter image description here

这会导致选择器在按钮触摸时立即被触发,而不是像你所设定的那样UIControlEventTouchUpInside,其中事件会在按钮附近结束触摸时发送。

虽然这是一个不错的解决方法(可能是解决方案?),但我仍然好奇为什么在按钮文本更新之前会有5秒的延迟。 - Gordon Glas
@Alphatrak 我的最佳猜测是你正在使用阻塞式网络操作,这意味着在主线程解除阻塞之前(或者当你的网络请求完成时),你的UI无法更新。 - CodaFi

1
发现问题所在。我是在completionHandler中设置按钮文本的,而这会在UI线程之外运行一个单独的线程。因此出现了5秒延迟的奇怪未定义行为。解决方法是调用...
[self performSelectorOnMainThread:@selector(receivedData:) withObject:result waitUntilDone:YES];

然后将setButtonText的调用放在“receivedData”方法中。

在更新UI时的黄金法则是在UI线程中更新。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接