2012-06-10 5 views
7

Я хотел бы найти первый вид ответчика в окне. Чтобы сделать это, я хотел бы реализовать категорию, как это:Как получить настоящего первого ответчика от оконного контроллера в какао?

@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 не имеет метода isFirstResponder, такого как UIResponder. Что эквивалентно для NSResponder?

Если вышеприведенный метод реализован, как указано выше, я, конечно же, получаю сообщение об отладке: «NSView» может не отвечать на «isFirstResponder» ».

Как заставить findFirstResponder работать в Cocoa?

Дополнительная информация: Я бы позже хотел бы использовать вышеупомянутый метод в моем контроллере окна в некотором роде, как:

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

ответ

27

Что случилось с -[NSWindow firstResponder], которая возвращает первый ответчик напрямую?

+0

'- [NSWindow firstResponder]' возвращает NSResponder. Как получить NSView, который является первым ответчиком? Тогда я мог бы сделать if if (firsResponderView == MyTableView), т. Е. Проверить, является ли представление текущим первым ответчиком? –

+10

Вид ** является ** ответчиком - 'NSView' наследуется от' NSResponder'. Итак, ваш оператор 'if' будет работать. В общем случае вы можете выполнить 'if ([firstResponder isKindOfClass: [NSView class]]) {NSView * firstResponderView = (NSView *) firstResponder;/* сделать что-то с firstResponderView * /} '. –

+2

+1 для ответа на вопрос. –

2

Если вы просто хотите, чтобы первый ответчик затем использовать firstResponderNSWindow метод.

Вы можете использовать NSApplications targetForAction: метод, если вы хотите, чтобы первый ответчик для конкретного действия (например, mouseDown:)

+0

Я не думаю, что это то, что мне нужно. Я хотел бы получить «isFirstResponder», работающий в категории. Я действительно не ищу ответа на щелчок пользователя. Я только упомянул об этом, так как, когда пользователь нажимает на элемент в представлении таблицы, я предполагаю, что он становится первым ответчиком. Все, что я хочу сделать, это найти Первого ответчика программным путем. Интересно, как они это сделали здесь: http://stackoverflow.com/questions/1823317/how-do-i-legally-get-the-current-first-responder-on-the-screen-on-an-iphone –

+0

Я отредактировал свой вопрос, пытаясь сделать его более ясным –

+0

@AA Я обновил свой ответ – diederikh

Смежные вопросы