2

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

在这里发现了这个警告 - 找到了多个名为“状态”的方法。如何解决这个问题。请帮我。

4

2 回答 2

6

sender键入为id。这意味着编译器将考虑在编译器知道的任何地方定义的所有方法作为sender可以响应的可能集合。

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

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

解决方案?

静态类型sender到某个特定的类(即 -(IBAction)toggleFiles:(SomeClass*)sender; 或类型转换返回值。

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

于 2013-05-18T07:08:12.977 回答
0

谢谢布姆。这是我的答案。我解决了我的问题。

- (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 * )。谢谢 。

于 2013-05-18T07:11:18.197 回答