3

我的目标是 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。当有人长按+发布时,我有什么想法可以让文本立即更新吗?

4

2 回答 2

1

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

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

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

在此处输入图像描述

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

于 2012-12-19T16:21:46.793 回答
1

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

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

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

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

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

于 2012-12-19T17:47:28.173 回答