没有已知的选择器实例方法' myWindowController'

时间:2014-10-28 07:46:50

标签: macos cocoa xcode6

我在应用程序中有以下代码(2011年编写)。

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

自升级到Xcode 6.1以来会产生以下错误: - ARC Semantic Issue No known instance method for selector 'myWindowController'

通过以下内容替换它不会产生错误。

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

PS Xcode似乎认为类型是' id< NSFileManagerDelegate>'

这里发生了什么?

我承认Cocoa和Xcode非常生疏。我相信我可以通过适当的演员来解决它,但这似乎没必要,我试图理解为什么。

更多信息

我的AppDelegate.h

IBOutlet MyWindowController *myWindowController;

和AppDelegate.m

@synthesize myWindowController;

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

2 个答案:

答案 0 :(得分:1)

我通过演员(MyAppDelegate *)解决了这个问题。

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

我已经断定这是一个Xcode 6.1错误,因为它似乎认为[NSApp delegate]返回类型id<NSFileManagerDelegate>

答案 1 :(得分:0)

  1. 确保导入包含MyWindowController @interface定义的标题。
  2. 使用(MyWindowController *)
  3. 投射[NSApp委托]

    所以你原来的一行:

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

    应该成为:

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

    你也可以使用(id)进行转换,这实际上就是你用ttt变量做的事情,但那是作弊的。在转换时使用适当的类将为您提供更好的编译器检查,并帮助Xcode提供准确的自动完成建议(这是在错误发生之前检测错误的好方法)。基本上声明或转换为id的对象意味着它可以是任何类的对象,因此任何类中定义的任何方法都将被视为有效。

    我自己也遇到了与Xcode 6.1相同的问题。我认为编译器在Xcode 6.1中以某种方式发生了变化。我希望自己有一个答案。它并没有在Xcode 6.1中灌输很多信心。