【问题标题】:initializing an NSWindowController subclass初始化 NSWindowController 子类
【发布时间】:2012-08-01 22:30:27
【问题描述】:

根据 Apple 的documentation,初始化 NSWindowController 子类的推荐方法是调用 init() 而不是 initWithWindowNibName()。文档继续说,由于 NSWindowController 可能只适用于它设计的 nib,然后让子类调用 super initWithWindowNibName,如果任何 initWithWindowNib... 方法是,子类应该记录一个错误调用。

这就是我写的:

- (id) init
{
    NSLog(@"init()");
    return [super initWithWindowNibName:@"MyDocument"];
}

- (id) initWithWindowNibName:(NSString *)windowNibName
{
    NSLog(@"error...use init() instead");
    return nil;
}

- (id) initWithWindowNibName:(NSString *)windowNibName owner:(id)owner
{
    NSLog(@"error...use init() instead");
    return nil;
}

- (id) initWithWindowNibPath:(NSString *)windowNibPath owner:(id)owner
{
    NSLog(@"error...use init() instead");
    return nil;
}

当它运行时,我看到的是输出:

init()
error...use init() instead

所以……嗯?怎么回事?

stackoverflow question 关于 init() 被调用了两次,解决方法是一个实例是通过代码创建的,另一个是通过 nib 创建的。我的笔尖根本没有控制器对象。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    问题在于[super initWithWindowNibName:@"MyDocument"] 只是一种方便的方法。它所做的只是调用[self initWithWindowNibName:@"MyDocument" owner:self]。这当然会引发您的错误消息。您可以通过将 init 方法更改为:

    - (id) init
    {
        NSLog(@"init()");
        return [super initWithWindowNibName:@"MyDocument" owner:self];
    }
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多