2009-12-23 109 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)