8

アプリのメイン メニュー内にメニュー項目があり、そのアクションをビュー コントローラー ( ) にルーティングしたいと考えていますNSViewController。インターフェイスの階層は次のようになりますNSWindowController。ウィンドウの内側には分割ビューがあり、分割ビューの右側のビューは によって制御されますNSViewController

Window + NSWindowController
    `-- NSSplitView
           `-- NSView
           `-- NSView + NSViewController

このメニュー項目は、Interface Builder の First Responder に接続されています。問題のView Controllerは適切なメソッドを実装していますが、メニュー項目は無効のままです。メソッドを に移動するNSWindowControllerと、メニュー項目が有効になります。

ビュー コントローラーをレスポンダー チェーンに渡す必要があると考えたので、それをnextResponderウィンドウ コントローラーの として設定しました。葉巻はありません。私は何を間違っていますか?

4

2 に答える 2

3

最後に、ウィンドウ コントローラーの基本クラスを追加し、呼び出しを「子」コントローラーに転送するようにしました。

- (id) childControllerForSelector: (SEL) selector
{
    for (id controller in [childControllers copy])
        if ([controller respondsToSelector:selector])
            return controller;
    return nil;
}

- (BOOL) respondsToSelector: (SEL) selector
{
    return [super respondsToSelector:selector] ? YES :
        [self childControllerForSelector:selector] ? YES :
            NO;
}

- (void) forwardInvocation: (NSInvocation*) invocation
{
    id child = [self childControllerForSelector:[invocation selector]];
    [invocation invokeWithTarget:child];
}

- (NSMethodSignature*) methodSignatureForSelector: (SEL) selector
{
    NSMethodSignature *signature = [super methodSignatureForSelector:selector];
    if (!signature) {
        id child = [self childControllerForSelector:selector];
        signature = [child methodSignatureForSelector:selector];
    }
    return signature;
}

これは大量のコードですが、コントローラーのコードをアドホック転送から解放する一般的なソリューションです。うまくいけば、それはあまりにも多くの魔法ではありません.

于 2012-07-13T09:49:55.357 に答える
2

ウィンドウ コントローラーをウィンドウのデリゲートとして設定すると、レスポンダー チェーンの一部になります。

の独自のサブクラスがあると仮定すると、NSWindowControllerそこでメニュー イベントをキャッチし、コントローラで適切なメソッドを呼び出すことができます。

残念ながら、ドキュメントでは、さまざまなビューとサブビューの間のレスポンダー チェーンに何かを挿入しようとしないようにアドバイスしているため、そこにビュー コントローラーを詰め込むことはできません。

詳細はこちら、しかし、あなたはすでにそれについて相談していると思います.

于 2012-07-12T17:08:48.880 に答える