9

ウィンドウで最初の応答者ビューを見つけたいと思います。これを行うには、次のようなカテゴリを実装したいと思います。

    @implementation  NSView (ViewExtensions)
- (NSView *)findFirstResponder
{
    if ([self isFirstResponder]) {        
        return self;     
    }

    for (NSView *subView in [self subviews]) {
        NSView *firstResponder = [subView findFirstResponder];

        if (firstResponder != nil) {
            return firstResponder;
        }
    }

    return nil;
}

@end

上記のコードは、SO: Get the current first Responder without using a private APIに関するこの質問/回答に基づいています。

おそらく問題は、NSResponder に UIResponder のような isFirstResponder メソッドがないことです。NSResponder に相当するものは何ですか?

上記のメソッドが上記のように実装されている場合、もちろん、「'NSView' は 'isFirstResponder' に応答しない可能性があります」というデバッグ メッセージが表示されます。

Cocoa で findFirstResponder を機能させるにはどうすればよいですか?

詳細情報: 後でウィンドウ コントローラーで上記のメソッドを次のような方法で使用したいと思います。

        NSArray *copiedObjects;
        if ([[self window]contentView] == MyTableView) {
            copiedObjects = [tableController selectedObjects];
        }
        if ([[self window]contentView] == MyOutlineView) {
            copiedObjects = [treeController selectedFolders];
        }
4

2 に答える 2

32

-[NSWindow firstResponder]ファーストレスポンダーを直接返す、の何が問題になっていますか?

于 2012-06-10T16:11:06.790 に答える
2

ファーストレスポンダーだけが必要な場合は、のfirstResponderメソッドを使用しNSWindowます。

特定のアクション(のような)targetForAction:の最初のレスポンダーが必要な場合は、NSApplicationsメソッドを使用することをお勧めしますmouseDown:

于 2012-06-10T14:34:18.003 に答える