Начните редактировать первый столбец NSBrowser

AppKit NSBrowser имеет ошибку, из-за которой метод */ - (void)editItemAtIndexPath:(NSIndexPath *)indexPath withEvent:(NSEvent *)theEvent select:(BOOL)select не работает для первого столбца в браузере. Если indexPath указывает на элемент в первом столбце, ничего не происходит. Есть еще одно свидетельство на http://www.cocoabuilder.com/archive/cocoa/327335-nsbrowser-edititematindexpath-withevent-select.html.

Я работал над обходным путем для этой ошибки. Смотрите мой ответ для кода.


person Jacob Gorban    schedule 08.09.2015    source источник


Ответы (1)


Решение, которое я нашел, состоит в том, чтобы имитировать нажатие клавиши возврата, которая входит в режим редактирования для ячейки после того, как ячейка была выбрана. Выбор правильного элемента остается за читателем. Честно говоря, если вы столкнулись с описанной выше проблемой, вы, вероятно, уже выбрали этот элемент раньше.

Я имитирую нажатие клавиши только в том случае, если хочу отредактировать первый столбец, хотя, вероятно, это сработает и в других столбцах, но для них я предпочитаю использовать настоящий API, то есть editItemAtIndexPath:withEvent:select:.

Итак, сначала я проверяю длину indexPath, чтобы убедиться, что она равна 1. Если это так, следующий код имитирует нажатие и отпускание клавиши возврата. self — это NSViewController, поэтому вам может потребоваться настроить его в зависимости от того, откуда вызывается этот код:

NSInteger windowNumber = [[self.view window] windowNumber];
NSEvent *keyDownReturn = [NSEvent keyEventWithType:NSKeyDown location:NSZeroPoint modifierFlags:0 timestamp:GetCurrentEventTime() windowNumber:windowNumber context:[NSGraphicsContext currentContext] characters:@"\r" charactersIgnoringModifiers:@"\r" isARepeat:NO keyCode:36];
NSEvent *keyUpReturn = [NSEvent keyEventWithType:NSKeyUp location:NSZeroPoint modifierFlags:0 timestamp:GetCurrentEventTime() windowNumber:windowNumber context:[NSGraphicsContext currentContext] characters:@"\r" charactersIgnoringModifiers:@"\r" isARepeat:NO keyCode:36];
[NSApp sendEvent:keyDownReturn];
[NSApp sendEvent:keyUpReturn];

Не забудьте #import <Carbon/Carbon.h> вместо GetCurrentEventTime(). Мне потребовалось время, чтобы найти это.

person Jacob Gorban    schedule 08.09.2015