我在这种方法中发现了警告。找到了多个名为'state'的方法?

时间:2013-05-18 06:56:17

标签: objective-c macos

我是mac开发的新手。这是我的代码,但我不明白这个警告。请帮帮我。

  - (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"];
 }

此处发出此警告 - 找到了名为“州”的多个方法。如何解决这个问题。请帮帮我。

2 个答案:

答案 0 :(得分:6)

sender的输入为id。这意味着编译器会将编译器所知道的所有方法都视为sender可以响应的可能事物集。

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

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

解?

静态键入sender到某个特定类(即 - (IBAction)toggleFiles :( SomeClass *)sender;或者对返回值进行类型转换。

在任何一种情况下,都要将assert([sender isKindOfClass:[ExpectedClass class]);之类的内容添加到该操作方法中以防御。

答案 1 :(得分: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 *)。谢谢。