Как сделать сочетание клавиш, чтобы закрыть диалог с Xcode / Interface Builder? - PullRequest
2 голосов
/ 27 июня 2009

Это кажется ужасно простой, но здесь идет. Если вы ориентированы на клавиатуру, вы привыкли использовать Command-W для постоянного закрытия окон в OS X. Я хотел бы добавить эту возможность в диалоги, которые я создаю в Interface Builder для моей программы. Я вижу, как добавить клавиатуру, эквивалентную действию кнопки, но что, если у меня нет кнопки?

Должен ли я добавить невидимую кнопку и поставить на нее ярлык? Кажется неуклюжим Конечно, есть только один метод, который я могу переопределить, но то, что я пробовал до сих пор, не работает.

Ответы [ 4 ]

8 голосов
/ 27 июня 2009

Когда вы нажимаете Command + W , это то же самое, что и выбор File -> Close в строке меню. Close отправляет сообщение performClose: первому ответчику. Это, в свою очередь, проверит, реализует ли получатель или делегат получателя windowShouldClose:, и окно закроется, если вернет YES (в противном случае он вызовет метод close).

Так что на самом деле, это зависит от того, какой тип диалога у вас здесь. Если он немодальный (по сути, если вы можете получить доступ к строке меню во время его работы) и является экземпляром или подклассом NSWindow, то все, что вам нужно сделать, это переопределить метод windowShouldClose: в делегате вашего диалогового окна (или класс диалога, если вы вложили в подкласс NSWindow или что-то еще) и верните его YES.

Однако , если это модальное диалоговое окно (вы не можете получить доступ к строке меню, переключать окна и т. Д. Во время работы диалога), то вы не можете сделать это таким образом. Вы могли бы добавить невидимую кнопку, но, честно говоря, модальное диалоговое окно не должно закрываться нажатием Command-W, поскольку это, безусловно, нарушает некоторые рекомендации Apple по интерфейсу. (Тем более что, как отметила Анде, стандартная практика - Esc закрывать / отменять диалог.)

2 голосов
/ 28 сентября 2009

Добавление невидимой кнопки работает просто отлично.

1 голос
/ 27 июня 2009

Является ли диалог NSWindow? Поскольку по умолчанию для параметра меню File->Close установлено действие performClose: первого респондента, а для него уже установлено значение command-w

Если диалоговое окно не является окном, просто сделайте ваш диалог первым респондентом и выполните действие performClose:.

0 голосов
/ 31 мая 2014

почему бы вам не попробовать это:

-(void)keyDown:(NSEvent *)theEvent{

    //If the key is X or x it just closes the window
    if ([theEvent.characters.uppercaseString isEqualToString:@"X"]) {
        [self.window performClose:self];
    }

}

или если вы хотите показать окно, вы можете создать его и показать там вместо executeClose

...