2012-12-19 24 views
3

我針對iOS 5.1和使用故事板。在UITableViewCell中有一個UIButton,當它被點擊時,調用「Touch Up Inside」方法,調用Web服務,然後在完成處理程序中,通過調用一個函數來更新UIButton的文本,該函數爲所有按鈕狀態設置文本像這樣:iOS: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

發現問題。我在completionHandler中設置了按鈕文本,它在UI線程中運行一個單獨的線程。因此,5秒延遲的奇怪的未定義行爲。修復方法是調用...

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

...然後將調用setButtonText放在「receivedData」方法中。

更新UI上的某些內容時的黃金法則是在UI線程中更新。

很明顯,如果我發佈了更多的代碼給我的問題,你會看到這個。對於那個很抱歉。至少獲得的教訓。

1

您不一定需要檢測長按,以及改變按鈕觸發選擇器的狀態。如果你這樣做編程,你應該有這樣的事情:

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

在XIB /故事板,該選項可在調色板下的「觸落」:

enter image description here

這會使選擇器在按下按鈕時立即觸發,而不是我可以假設的,您已設置爲UIControlEventTouchUpInside,在按鈕附近的觸摸結束時發送事件。

+0

雖然這是一個很好的解決方法(可能是解決方案?),但我仍然好奇爲什麼在按鈕文本更新之前有5秒的延遲。 –

+0

@Alphatrak我最好猜測的是你正在使用阻止網絡操作,這意味着你的用戶界面無法在主線程解除阻塞之前更新(或者,因此,當你的網絡請求完成時)。 – CodaFi

相關問題