Я хотел бы найти первый вид ответчика в окне. Чтобы сделать это, я хотел бы реализовать категорию, как это:Как получить настоящего первого ответчика от оконного контроллера в какао?
@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];
}
'- [NSWindow firstResponder]' возвращает NSResponder. Как получить NSView, который является первым ответчиком? Тогда я мог бы сделать if if (firsResponderView == MyTableView), т. Е. Проверить, является ли представление текущим первым ответчиком? –
Вид ** является ** ответчиком - 'NSView' наследуется от' NSResponder'. Итак, ваш оператор 'if' будет работать. В общем случае вы можете выполнить 'if ([firstResponder isKindOfClass: [NSView class]]) {NSView * firstResponderView = (NSView *) firstResponder;/* сделать что-то с firstResponderView * /} '. –
+1 для ответа на вопрос. –