我是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"];
}
此处发出此警告 - 找到了名为“州”的多个方法。如何解决这个问题。请帮帮我。
答案 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 *)。谢谢。