【问题标题】:No known instance method for selector 'myWindowController'选择器“myWindowController”没有已知的实例方法
【发布时间】:2014-10-28 07:46:49
【问题描述】:

我在一个应用程序中有以下代码(写于 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'

这是怎么回事?

我承认对 Cocoa 和 Xcode 非常生疏。我确信我可以通过适当的演员来修复它,但这似乎没有必要,我正试图了解原因。

更多信息

我的 AppDelegate.h

IBOutlet MyWindowController *myWindowController;

还有 AppDelegate.m

@synthesize myWindowController;

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

【问题讨论】:

    标签: macos cocoa xcode6


    【解决方案1】:

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

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

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

    【讨论】:

    • 你应该接受这个解决方案,即使它是你自己的。
    【解决方案2】:
    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 灌输很大的信心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 2014-09-16
      • 1970-01-01
      相关资源
      最近更新 更多