2014-02-15 127 views
-2

我已經瀏覽了Stack Overflow上的無數問題,所有人都問了同樣的問題。你如何以編程方式禁用UIButton?他們都沒有正確回答這個問題。我曾嘗試:以編程方式禁用UIButton

[myButton setEnabled:NO]; 

self.myButton.enabled = NO; 

[self.myButton setEnabled:NO]; 

和無數其他。沒有任何工作。

我聲明瞭按鈕,所以在.h文件:

- (IBAction)myButton; 

什麼是正確的語法來做到這一點?我試圖關閉viewDidLoad中的按鈕,以便稍後重新啓用它。 (我知道[myButton setEnabled:NO];可以用於通過IBOutlet聲明的按鈕,但它不適用於通過IBAction聲明的按鈕。)

+0

建議 - 當表面上看起來明顯不起作用時,在運行時驗證該變量不是「nil」。 – rmaddy

+1

上週你問過同樣的問題嗎? http://stackoverflow.com/questions/21637388/how-to-programmatically-disable-enable-a-uibarbuttonitem –

+0

@XuYin這是我第一次真正讓按鈕正確禁用。這是一個相似但不同的問題。 –

回答

7

如果您執行類似操作,您將知道代碼是否正常工作這樣的:

if(self.myButton) 
{ 
    [self.myButton setEnabled:NO]; 
} else { 
    NSLog(@"hey look, I forgot to connect the myButton outlet property!"); 
} 

此外,您的按鈕應該被聲明爲 「IBOutlet」,例如:

// I use "weak" here because it's retained/kept by the storyboard/XIB file, although 
// you could also use "strong"... 
@property (weak) IBOutlet UIButton *myButton; 

,需要聲明如下動作:

- (IBAction) myButton: (id) sender; 

所有的IBActions都採用「sender」屬性。

+0

爲什麼我不會將該按鈕聲明爲「IBAction」按鈕? –

+0

因爲「IBAction」是由按鈕(或控件)調用的*動作*。 –

+0

@MichaelDautermann僅供參考 - 操作的'sender'參數實際上是可選的。您只需要處理多個按鈕的操作。 – rmaddy

1

當我還在學習可可時,我也在爲此而苦苦掙扎。

讓我試着澄清你已經得到的答案,因爲它聽起來對你沒有意義。

IB中的UI元素故障排除就像排除立體聲系統或計算機故障。在立體聲系統中,請務必檢查電纜。通常問題的原因是不好的聯繫。

與接口代碼類似,原因通常是IBOutlet或IBAction連接斷開或缺失。

至於什麼IBOutlets和IBActions是:

IBOutlets是連接東西:某種UIView的對象。有時一個插座連接到一個按鈕,有時是一個標籤,一個文本字段或其他東西。名稱「outlet」意味着它用於輸出,如在標籤或文本字段中顯示信息。這就是它被稱爲IBOutlet的原因。 (雖然你可以有一個IBOutlet連接到UIButton,所以你可以做一些事情,如啓用/禁用按鈕。)

IBActions是動詞。他們告訴一個UIControl對象(就像一個按鈕),當事件發生時,它應該執行什麼代碼(操作方法)。名字中的「動作」一詞是您記憶的助記符。

對於您的情況,您希望通過代碼啓用/禁用按鈕。爲了做到這一點,你需要一個IBOutlet連接。

您需要在頭文件中定義IBOutlet(代碼中的插座是套接字,以繼續立體聲比喻),然後您需要將視圖對象(立體聲組件)連接到IBOutlet(套接字) 。連接是電纜。如果你沒有建立連接,那麼IBOutlet(套接字)是空的,並且沒有連接任何東西。 (電纜丟失。)

您可以進入IB,選擇您的故事板場景,選擇您的按鈕並顯示「連接檢查器」。它應該顯示一個IBOutlet連接到你的視圖控制器。

或者,正如Michael建議的那樣,您可以添加一條日誌語句以在運行時檢查插座連接是否良好。

這有幫助嗎?