2012-06-10 12 views
7

Me gustaría encontrar la vista del primer respondedor en una ventana. Para ello, me gustaría poner en práctica una categoría como esta:¿Cómo obtener el primer respondedor actual del controlador de ventana en Cocoa?

@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 

El código anterior se basa en esta pregunta/respuesta en SO: Get the current first responder without using a private API.

El problema, tal vez, es que NSResponder no tiene un método isFirstResponder como lo hace UIResponder. ¿Cuál es el equivalente para NSResponder?

Si el método anterior se implementa como se indica anteriormente, por supuesto obtengo el mensaje de depuración: "'NSView' puede no responder a 'isFirstResponder'".

¿Cómo puedo hacer que findFirstResponder funcione en Cocoa?

Más información: Más tarde me gustaría utilizar el método anterior en mi controlador de ventana de cierta manera como:

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

Respuesta

27

¿Qué hay de malo en -[NSWindow firstResponder], que devuelve el primer nivel de respuesta directa?

+0

'- [NSWindow firstResponder]' devuelve un NSResponder. ¿Cómo obtengo el NSView que es el primer respondedor? Entonces podría hacer 'if (firsResponderView == MyTableView)', es decir, probar si una vista es la primera respuesta actual. –

+10

Una vista ** es ** un respondedor - 'NSView' hereda de' NSResponder'. Por lo tanto, su declaración 'if' simplemente funcionará. Para el caso general, puede hacer 'if ([firstResponder isKindOfClass: [clase NSView]]) {NSView * firstResponderView = (NSView *) firstResponder;/* hacer algo con firstResponderView * /} '. –

+2

+1 para responder con una pregunta. –

2

Si lo que desea es el primero en responder a continuación, utilizar el método de NSWindowfirstResponder.

Es posible que desee utilizar NSApplications targetForAction: método si desea que el primer nivel de respuesta para una acción particular (como mouseDown:)

+0

No creo que sea eso lo que busco. Me gustaría que "isFirstResponder" funcione en la categoría. Realmente no estoy buscando una respuesta para un clic del usuario. Solo mencioné eso ya que, cuando el usuario hace clic en un elemento en la vista de tabla, asumo que se convierte en el Primer Respondedor. Todo lo que quiero hacer es encontrar el Primer respondedor programáticamente. Me pregunto cómo lo hicieron aquí: http://stackoverflow.com/questions/1823317/how-do-i-legally-get-the-current-first-responder-on-the-screen-on-an-iphone –

+0

He editado mi pregunta para aclarar –

+0

@AA He actualizado mi respuesta – diederikh

Cuestiones relacionadas