【问题标题】:NSWindowController windowDidLoad not calledNSWindowController windowDidLoad 未调用
【发布时间】:2010-04-23 01:44:03
【问题描述】:

我有一个使用 NSWindowController 子类的简单 Cocoa 应用程序。在我设置的笔尖中:

  • 文件所有者的类到我的 NSWindowController 子类
  • 文件所有者的“窗口”出口到 nib 中的主 NSWindow。

我的 NSWindowController 子类的 init 方法被调用(我调用 super),但无论我做什么 windowDidLoad 都不会被调用。

我一定遗漏了一些明显的东西,但对于我的一生,我无法弄清楚它是什么。

【问题讨论】:

  • 你是如何初始化课程的?你是在调用 super 的 -initWithWindowNibName: 实现吗?
  • 我的 NSWindowController 子类是在 nib 中实例化的,就像这个文档所说的:developer.apple.com/mac/library/documentation/cocoa/conceptual/… 基本上,MainMenu.xib 创建它
  • 我遇到了类似的问题:我没有接到 - (void)windowDidLoad 的电话。经过一番挖掘,我在我的 NSWindowController 子类中发现了我的错误,我已将 window 声明为属性。我删除了该成员并调用了showWindow: 方法以成功获取窗口。

标签: cocoa nswindowcontroller


【解决方案1】:

您正在尝试通过在另一个 nib 中实例化 NSWindowController 的实例来创建它。但是,当您在 nib 文件中实例化对象时,它会通过调用 -initWithCoder: 进行初始化。

-initWithCoder: 不是NSWindowController 的指定初始化程序,因此您的NSWindowController 实例实际上永远不会加载它的笔尖。

不要通过将 NSWindowController 实例放在 Interface Builder 的 MainMenu.xib 文件中来实例化它,而是以编程方式创建它:

AppDelegate.h

@class YourWindowController;
@interface AppDelegate : NSObject
{
    YourWindowController* winController;
}
@end

AppDelegate.m 中:

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification*)notification
{
    winController = [[YourWindowController alloc] init];
    [winController showWindow:self];
}
- (void)dealloc
{
    [winController release];
    [super dealloc];
}
@end

YourWindowController.m

@implementation YourWindowController
- (id)init
{
    self=[super initWithWindowNibName:@"YourWindowNibName"];
    if(self)
    {
        //perform any initializations
    }
    return self;
}
@end

【讨论】:

    【解决方案2】:

    通过 nib 实例化窗口控制器非常好。而不是使用windowDidLoad 作为你的钩子,在这种情况下你会想要使用awakeFromNib

    【讨论】:

      【解决方案3】:

      该窗口可能会按需加载 - 尝试在 -init 中将 window 发送给您自己。请参阅the discussion of -[NSWindowController loadWindow] in the documentation 了解更多信息。

      【讨论】:

      • 刚刚尝试过——[self window] 在初始化期间为空(即使在调用 super 之后)。我会继续挖掘。
      【解决方案4】:

      如果你写了

      TTEst *test3 = (TTEst *)[[NSWindowController alloc] initWithWindowNibName:@"TTEst"];
      

      试试

      TTEst *test3 = [[TTEst alloc] initWithWindowNibName:@"TTEst"];
      

      这很重要!当然第一行是错误的......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多