2013-05-18 69 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

相關問題