2013-05-18 42 views
2

我是mac开发新手。这是我的代码,但我不明白这个警告。请帮帮我。我发现这种方法的警告。找到多个名为'state'的方法?

- (IBAction)toggleFiles:(id)sender 
    { 
NSRect frame = [oWindow frame]; 
NSRect contentRect = [oWindow contentRectForFrameRect:frame]; 
float titlebarHeight = NSHeight(frame) - NSHeight(contentRect); 

NSSize newSize = [sender state] == NSOnState ? sFilesExpandedSize : sFilesCollapsedSize; 
frame.origin.y -= newSize.height - contentRect.size.height; 
frame.size = newSize; 
frame.size.height += titlebarHeight; 

[oWindow setFrame:frame display:YES animate:YES]; 

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:(int) [sender state] == NSOnState] 
              forKey:@"DisplayFiles"]; 
} 

这里找到了这个警告 - 找到了多个名为'state'的方法。如何解决这个问题。请帮帮我。

+1

什么是发件人的类型? – CRDave

+0

Duck typing Vs Xcode 4. – uchuugaka

回答

0

感谢bbum。这里是我的答案。我解决我的问题。

- (IBAction)toggleFiles:(id)sender 
{ 
NSRect frame = [oWindow frame]; 
NSRect contentRect = [oWindow contentRectForFrameRect:frame]; 
float titlebarHeight = NSHeight(frame) - NSHeight(contentRect); 
    NSCell *cell =sender; 
    Bool fleg = [cell state] == NSOnState; 
NSSize newSize = fleg ? sFilesExpandedSize : sFilesCollapsedSize; 
frame.origin.y -= newSize.height - contentRect.size.height; 
frame.size = newSize; 
frame.size.height += titlebarHeight; 

[oWindow setFrame:frame display:YES animate:YES]; 

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:[fleg 
              forKey:@"DisplayFiles"]; 
} 

我发送者。感谢之前只添加(的NSCell *)。

+1

为了防御,我会建议在剧组之前添加'assert([sender isKindOfClass:[NSCell class]]);'就行了(或之后,无所谓)。 – bbum

6

sender键入为id。这意味着编译器会将编译器意识到的所有方法都视为sender可以响应的可能集合。

不幸的是,有两个state方法(或更多)声明有不同论证。例如,可能会返回一个BOOL,并且可能会返回NSUInteger

因此,编译器警告您在一般类型(id)对象上调用state可能会产生意外结果,因为无法知道返回值的类型可能是什么类型。

解决方案?

或者静态地键入sender一些特定的类别(即, - (IBAction为)toggleFiles:(SomeClass的*)发送者;或强制转换的返回值

在任一情况下,添加类似assert([sender isKindOfClass:[ExpectedClass class]);到该操作方法是。防守。

+1

另外要注意的是,通过将发件人键入为id,它允许您执行诸如让多个控件调用相同的IBAction方法之类的事情,然后在该方法内根据发件人的类处理事情。 – uchuugaka

相关问题