2014-10-28 75 views
0

我在應用程序(它是在2011年編寫的)中有以下代碼。沒有已知的實例方法選擇器'myWindowController'

[[[[NSApp delegate] myWindowController] ...] ..]; 

由於升級到的Xcode 6.1這將產生以下的錯誤: - ARC Semantic Issue No known instance method for selector 'myWindowController'

通過以下更換此不產生錯誤。

id ttt = [NSApp delegate]; 
[[[ttt myWindowController] ...] ...]; 

PS Xcode中似乎認爲類型是 '身份證< NSFileManagerDelegate>'

這到底是怎麼回事?

我承認Cocoa和Xcode很生鏽。我相信我可以通過適當的演員來解決它,但這似乎沒有必要,我試圖理解爲什麼。

更多信息

我AppDelegate.h

IBOutlet MyWindowController *myWindowController; 

而且AppDelegate.m

@synthesize myWindowController; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    myWindowController = [[MyWindowController alloc] initWithWindowNibName:@"MainWindow"]; 

回答

0
  1. 確保您導入包含MyWindowController @interface定義的標題。
  2. 使用(MyWindowController *)強制轉換[NSApp委託]。

所以你的原線路:

[[[[NSApp delegate] myWindowController] ...] ..]; 

應該變成:

[[[(MyAppDelegate *)[NSApp delegate] myWindowController] ...] ..]; 

你也可以投用(ID),這是有效的,你與TTT變量做什麼,但這是一個作弊。在轉換時使用適當的類可以爲您提供更好的編譯器檢查以及幫助Xcode提供準確的自動填充建議(這是在發生錯誤之前檢測錯誤的好方法)。基本上,一個聲明或轉換爲id的對象意味着它可以是任何類的一個對象,因此在任何類中定義的任何方法都將被視爲有效。

我自己也遇到了與Xcode 6.1相同的問題。我認爲編譯器在Xcode 6.1中發生了某種變化。我希望自己有一個答案,爲什麼,我自己。它並沒有給Xcode 6.1灌輸很多信心。

0

我用演員表(MyAppDelegate *)解決了這個問題。

[[[(MyAppDelegate *)[NSApp delegate] myWindowController] currentTvc] saveTableColumns]; // Xcode 6.1 error 

我已得出結論,因爲它似乎認爲[NSApp delegate]返回類型爲id<NSFileManagerDelegate>

這是一個Xcode 6.1錯誤
相關問題