Создание приложения меню macOS, похожего на 1Password

Я пытаюсь создать приложение меню MacOS, которое будет иметь текстовое поле в качестве первого элемента. Текстовое поле будет служить панелью поиска для фильтрации других элементов, которые будут отображаться под ним.

Это должно выглядеть очень похоже на 1password:

1password

Вот что мне удалось сделать:

мой

Я добился этого, создав Status menu с тремя элементами и создав собственное представление для первого элемента в меню.

Однако этот подход, похоже, не решает мою проблему. При нажатии cmd + A в поле поиска фокус переходит к следующему элементу меню. Это поведение по умолчанию для NSMenu.

Итак, мой вопрос: правильный ли это подход для создания приложения, подобного 1Password, или есть лучший?


person Jerguš Lejko    schedule 20.10.2017    source источник


Ответы (1)


В принципе подход правильный.

Но вы должны явно перехватывать ключевые события редактирования. Подкласс NSTextField и переопределение performKeyEquivalent

class AXCVTextField: NSTextField {

    override func performKeyEquivalent(with event: NSEvent) -> Bool {
        if event.modifierFlags.contains(.command),
          let key = event.charactersIgnoringModifiers {
            var action : String?
            switch key {
            case "x": action = "cut:"
            case "c": action = "copy:"
            case "v": action = "paste:"
            case "a": action = "selectAll:"
            default:
                break
            }
            if let action = action {
                return NSApp.sendAction(Selector(action), to:self.window!.firstResponder, from:self)
            }
        }
        return super.performKeyEquivalent(with: event)
    }
}
person vadian    schedule 22.10.2017
comment
Я создал подкласс class SearchField: NSTextField {...} и установил его как класс NSTextField. Однако метод не срабатывает, когда я нажимаю cmd + A. Кроме того, я только что понял, что иногда, когда я запускаю приложение, я не могу нажать на ввод. Он перестает отвечать на запросы, но другие NSMenuItem работают нормально. - person Jerguš Lejko; 23.10.2017
comment
Конечно, вы должны разработать свои представления, чтобы текстовое поле находилось в цепочке респондентов для получения ключевых событий. - person vadian; 23.10.2017
comment
Хотите объяснить немного подробнее? у меня проблемы с поиском в гугле - person Jerguš Lejko; 24.10.2017
comment
Чтобы иметь возможность получать (ключевые) события, представление должно находиться в окне, которое может стать ключевым окном. Я предполагаю, что 1Password использует отдельный оконный контроллер, а не простой NSMenu - person vadian; 24.10.2017
comment
не могли бы вы предложить заменить NSMenu пользовательским окном, которое отображается вместо NSMenu по умолчанию, и реализовать все в этом окне? - person Jerguš Lejko; 24.10.2017
comment
Вероятно, есть несколько решений, как уже упоминалось, в любом случае вам нужно ключевое окно - person vadian; 24.10.2017
comment
Давайте продолжим обсуждение в чате. - person Jerguš Lejko; 24.10.2017