2010-05-05 3 views
1

Как я могу перемещаться по моему табличному виду с помощью клавиш со стрелками. Так же, как setAction: или setDoubleAction, но вместо того, чтобы реагировать на клики, реагируйте с помощью клавиш со стрелками вверх или вниз по столу.NSTableView перемещаться с помощью клавиш со стрелками

+0

Этот вопрос не имеет смысла. Не могли бы вы прочитать его еще раз? Вы хотите реагировать на то, что кто-то просматривает ваш стол? –

+0

есть. Подобно тому, как «setAction» работает с кликами, но мне нужно что-то похожее на работу с клавишами со стрелками. –

+1

Клавиши со стрелками «просто работают», ничего лишнего не требуется. – junglecat

ответ

7

В вашем представлении делегат таблицы реализует tableView:shouldSelectRow:. Сделайте все, что хотите, затем верните YES. Он будет активирован при выборе элементов в представлении таблицы.

+0

отлично работает. Благодаря!!! –

+0

При попытке этого решения я обнаружил, что при перемещении вверх и вниз с помощью клавиш со стрелками, хотя shouldSelectRow отвечает YES каждый раз, мой метод tableViewSelected не вызывался. То, что я закончил, - это вызов отдельной процедуры из tableViewSelected и shouldSelectRow для выполнения других аспектов отображения, которые требуются при каждом изменении фокуса. Наверное, это то, что ответ означает «Делайте все, что захотите». –

3

Я не уверен, что вы имеете в виду, потому что, когда я выбираю что-то в таблице, я могу перемещаться вверх и вниз в таблице с помощью клавиш со стрелками. Но если вы хотите настроить поведение больше, у меня есть решение. В одном из моих приложений я хотел обнаружить, когда нажата клавиша возврата или ввода, а затем выполните некоторые действия соответственно. Я создал новый класс и сделал его подклассом NSWindow. В построителе интерфейса я устанавливаю главное окно этого класса. Затем я переопределяю метод keyDown: NSWindow в этом подклассе. Поэтому, когда мое главное окно находится впереди (первый ответчик), тогда нажатия клавиш обнаруживаются и фильтруются методом. Я уверен, что вы можете сделать что-то подобное для стрелочных прессов. Возможно, вы захотите сделать свой класс подклассом NSTableView вместо NSWindow в зависимости от того, как вы хотите поймать нажатия клавиш. Я хотел, чтобы он работал для всего приложения, но вы можете захотеть его работать, только когда представление таблицы является первым ответчиком.

- (void)keyDown:(NSEvent *)theEvent { 
    if ([theEvent type] == NSKeyDown) { 
     NSString* characters = [theEvent characters]; 
     if (([characters length] > 0) && (([characters characterAtIndex:0] == NSCarriageReturnCharacter) || ([characters characterAtIndex:0] == NSEnterCharacter))) { 
      // do something here when return or enter is pressed 
     } 
    } 
} 
+0

Я не понимаю, почему люди не понимают, что я прошу. Все, что я хочу сделать, это использовать клавиши со стрелками в качестве замены для щелчка. Поэтому, если я стрелка вниз до строки x, он будет делать действие так же, как «setAction» делает для нажатия –

0

Вы уверены, что не имеете смысла, потому что стрелки используются для выбора, а не для выполнения каких-либо действий. Действие, которое будет применено к ОТДЕЛЬНОМУ ПУНКТУ, обычно устанавливается с помощью свойства «действие» или «двойное действие» TableView.

Нажатие на стол-строку делает две разные вещи.

  1. пытается выбрать строку таблицы (иногда таблица-строка может ОТКАЗЫВАЕТСЯ быть выбрана, поэтому существует «shouldSelect» метод делегата).

  2. Если был сделан новый выбор, выполняется действие (с таблицейView в качестве отправителя). Там вы можете спросить таблицу о текущем выборе и сделать все, что вам нужно.

Пожалуйста, обратите внимание на ситуацию, когда есть НЕСКОЛЬКО выбранные строки или выбранные столбцы или многие другие сложные ситуации.

В вашем случае --- что я рекомендовал бы, что вы реализуете

selectionDidChange: (NSNotigivation) уведомление;

NSTableView вызов делегата. Это называется ПОСЛЕ выбора, и вы уже знаете новый текущий выбор и делаете все, что хотите, с выбранными элементами.

2

aha! Вы случайно сделали BREAK NSTableView, выполнив это?

@implementation NSTableView (DeleteKeyCategory) 
-(void) keyDown: (NSEvent *) event 
{ 
    // ... do something ... 

    [super keyDown:event]; 
} 
@end 

Для меня это было порочным побочным эффект ЗАМЕНЫ KeyDown NSTableView в: рутине, и она сломалась клавишами управления курсором. (вид, подобный swizzling)

Уроки, которые я узнал: - избегайте keyDown: рутина вообще. - подклассификация Apple NSControls сохранит работу в долгосрочной перспективе.

Это тип ошибки, который делает использование NSTableView очень расстраивающим. Может быть, Apple может обнаружить такие вещи в статическом анализаторе?

+0

да вот почему я здесь;) Я забыл называть супер –

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