日々精進

新しく学んだことを書き留めていきます

NSWindowのdelegateメソッドが呼ばれない

windowDidResignKeyが呼ばれなくて困ったという話。


NSWindowのサブクラスで↓のようにself.delegate = selfとしてNSWindowDelegateのメソッドを自分で処理しようとしたがdelegateメソッドが全然呼ばれない。

- (id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)aStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)flag{
    self = [super initWithContentRect:contentRect styleMask:aStyle backing:bufferingType defer:flag];
    if (self) {
        self.delegate = self;
        ・・・
    }
    return self;
}

- (void)windowDidResignKey:(NSNotification *)notification; {
    if (self.isVisible) {
        self.showing = NO;
    }
}

調べてみたらNSWindowControllerからwindowがロードされたタイミングで強制的にdelegate先がNSWindowControllerにされるっぽい。まじか。。
しょうが無いのでwindowDidResignKeyをNSWindowController側に移して解決した。