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];
}
'- [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. –
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 * /} '. –
+1 para responder con una pregunta. –