2009-12-23 526 views
2

我是Cocoa新手,正在通過Hillegass的書工作。我在第20章的挑戰2中遇到了麻煩。複選框狀態問題

挑戰是如果要繪製的字母是斜體,粗體或兩者都添加的複選框。

-(IBAction)toggleItalic:(id)sender 
{ 
int state = [italicBox state]; 
NSLog(@"state %d", state); 
if (state = 1) { 
    italic = YES; 
    NSLog(@"italic is yes"); 
} 
else { 
    italic = NO; 
    NSLog(@"italic is no"); 

} 
} 

眼下,這個代碼片段中時,選中此複選框時未選中此框返回的是,。我究竟做錯了什麼?

謝謝,

賈斯汀。

+0

順便說一句:如果你得到一個答案,可以幫助你,「接受」它。這有助於向回答方聲望,並且如果他們擊中了它,繞過「代表帽」...即我。 :) – MarkPowell 2009-12-23 18:27:59

回答

9

你的問題就出在你的if語句:

if (state = 1) { 

你值1分配狀態:state = 1,而你需要測試的是,如果當前狀態爲1:state ==1

這是一個相當常見的錯誤(特別是在允許在if語句中賦值的語言中)。一個技巧學習來解決這個問題是讓你比較檢查,像這樣:

if (1 == state) 

您不能分配1另一個值。因此,如果您錯誤地使用了=而不是==,則會出現編譯器錯誤,這是一個簡單的修復方法。

+6

正確性。另外,你應該直接使用枚舉'NSOnState'和'NSOffState'來代替數值。避免幻數。 =) – 2009-12-23 17:44:17

+1

與nil/NULL或任何其他類型的常量進行比較的情況也是如此。在C風格的語言中,始終將常量放在首位是明智的('if(nil == someObject)'將爲您節省很多麻煩)。 – jbrennan 2009-12-23 17:51:50

+0

你也可以打開一個編譯器警告,GCC中的'-Wparentheses'或者Xcode中的「Missing Braces and Parentheses」,它會在你犯這個錯誤時提醒你。你可以添加一對額外的對,如果你真的這麼做的話(例如,「if((self = [super init]))'」)。還有一個編譯器選項「-Werror」/「將警告視爲錯誤」,它會發出任何警告 - 包括這一個 - 打破你的構建,這樣你就不會錯過或忽略它。 – 2009-12-24 11:40:09

4

使用的比較,而不是分配和使用正確的枚舉,而不是可能會改變硬編碼值:

if (state == NSOnState) 
else if (state == NSOffState)