我有一個簡單但令人煩惱的問題試圖禁用NSButton。這裏是示例代碼來說明問題:
- (IBAction)taskTriggeredByNSButtonPress:(id)sender {
[ibOutletToNSButton setEnabled:NO];
//A task is performed here that takes some time, during which time
//the button should not respond to presses.
//Once the task is completed, the button should become responsive again.
[ibOutletToNSButton setEnabled:YES];
}
這是我觀察。我按下按鈕。該按鈕變爲禁用狀態(通過其褪色外觀來判斷),並且任務開始執行。當按鈕被禁用並且任務正在執行時,我再次按下該按鈕。沒有任何事情立即發生,但一旦任務完成,taskTriggeredByNSButtonPress:
方法被稱爲第二次,這表明第二次按鈕按下被擱置,然後激活,一旦按鈕被重新啓用。
我試過各種黑客手段,以防止第二個按鈕按下被識別,包括在[ibOutletToNSButton setEnabled:NO];
聲明後引入一段時間延遲,使按鈕隱藏而不是禁用,在此期間使用自定義視圖遮蓋按鈕它應該被禁用,將按鈕的enabled
狀態綁定到一個屬性,以及其他我很尷尬的事情。
請幫我理解爲什麼我不能得到這個簡單的任務禁用按鈕的工作。
您的'buttonPushed:'方法會立即將按鈕設置爲啓用,因爲分離線程所需的時間可以忽略不計。您需要在處理完成後更新按鈕的狀態,這需要使用'performSelectorOnMainThread:withObject:'從輔助線程進行通知或方法調用。 – 2011-12-30 23:07:54
你們太棒了。我使用NSThread在後臺線程上運行了長時間的任務,正如Rob建議的那樣,從輔助線程重新啓用了按鈕。瞧!用戶界面不僅保持響應,而且按鈕應該禁用並重新啓用。 Randy,感謝你提供關於使用'sender'的提示。這是一個很好的效率。 – scolfax 2011-12-31 04:09:36
@RobKeniger對不起,我沒有注意到我的錯誤。謝謝,我會更新它。 – 2011-12-31 12:51:56