【问题标题】:initWithWindow: in window controller not get calledinitWithWindow:在窗口控制器中没有被调用
【发布时间】:2015-03-12 12:44:33
【问题描述】:

我是 Cocoa 编程的新手。

在 Xcode 6.1 中,我使用情节提要创建了一个 OS X 应用程序。开箱即用的大纲中有一个窗口控制器。我将其在“Identity Inspector”中的类更改为NSWindowController 的自定义子类,命名为WindowController

我在WindowController@implementation中写了如下代码:

- (instancetype)initWithWindow:(NSWindow *) window {
    NSLog(@"window");
    window.titleVisibility = NSWindowTitleHidden;
    return [super initWithWindow:window];
}

但是输出面板什么也没显示。

如果我覆盖类中的windowDidLoad 方法,

- (void)windowDidLoad {
    [super windowDidLoad];
    self.window.titleVisibility = NSWindowTitleHidden;
    NSLog("@Cool...");
}

消息出现。

doc of NSWindowController 表示-initWithWindow: 是该类的指定初始化器。怎么能跳过?

How Window Controllers Work section of Window Programming Guide 中,它说:

对于简单文档(即只有一个包含窗口的 nib 文件的文档),您几乎不需要直接使用 NSWindowController 对象。 AppKit 为您创建了一个。但是,如果默认的窗口控制器不够用,可以创建NSWindowController的自定义子类。

这正是我正在做的。但我不知道我在这里错过了什么。

谢谢!

【问题讨论】:

  • 可能与故事板的使用有关,您如何设置/实例化窗口控制器?仅在情节提要中或代码中?
  • 嗨,@Volker。感谢你的回复。我只是使用故事板。我不明白为什么initWithWindow: 被绕过了。

标签: objective-c macos cocoa


【解决方案1】:

据我所知,您应该首先使用 initWithWindow 调用 super ,然后设置标题。否则,对 super 的调用会在没有先前设置的情况下初始化窗口。 重写windowDidLoad方法时,初始化后设置标题可见性,一切正常。

【讨论】:

  • 谢谢:-) 但是initWithWindow:中添加的NSLog没有生效。是否表示 initWithWindow: 被跳过?我猜这里有什么魔法。如果这里跳过,是否意味着我们不应该覆盖initWithWindow:而应该在windowDidLoad中编写初始化代码?而我刚刚阅读了Would it be correct/ellegant use only alloc without init? 并认为它不应该被跳过。
猜你喜欢
  • 1970-01-01
  • 2016-12-03
  • 2018-09-19
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多