Последовательно перемещайте выделение в NSCollectionView

По умолчанию выбор в NSCollectionView перемещается клавишами со стрелками в пределах одной строки (или столбца).

Как сделать так, чтобы выделение двигалось последовательно, как элементы, упорядоченные по индексу?

Снимок экрана с сайта developer.apple.com


person niknamelogin    schedule 05.09.2017    source источник
comment
Вы когда-нибудь находили решение? Когда я использую режим массива контента (устаревший), он ведет себя таким образом, но если я использую макет потока, это не так.   -  person mohacs    schedule 10.10.2017
comment
Нет, я не нашел решения. Я пробовал float, custom, grid и legacy, но когда выделение достигает границы (левой/правой), ничего не происходит. Он остается неподвижным, когда вы пытаетесь переместить выделение клавишами на клавиатуре.   -  person niknamelogin    schedule 15.10.2017
comment
без чего-либо лишнего он работает в устаревшем режиме, но не в любом другом. Я связался со службой технической поддержки разработчиков Apple, они сказали, что после проверки наши инженеры рассмотрели ваш запрос и решили, что это лучше всего обработать как отчет об ошибке.   -  person mohacs    schedule 15.10.2017
comment
Надеюсь они исправят этот баг. Спасибо!   -  person niknamelogin    schedule 16.10.2017


Ответы (1)


Я задал тот же вопрос в службу технической поддержки разработчиков Apple, после проверки они сказали: «Наши инженеры рассмотрели ваш запрос и решили, что это лучше всего обработать как отчет об ошибке». Я отправил отчет об ошибке на радар Apple. Пока нет ответа.

Я решил реализовать собственное решение. Подкласс вашего NSCollectionView и переопределите событие keyDown.

Свифт 4

override func keyDown(with event: NSEvent) {
    if event.modifierFlags.rawValue == 10617090 {
        return
    }
    if event.isARepeat == true && event.keyCode != 123 && event.keyCode != 124 && event.keyCode != 125 && event.keyCode != 126 {
        return
    }
    if event.keyCode == 123 || event.keyCode == 124 || event.keyCode == 125 || event.keyCode == 126 {
        for index in self.selectionIndexes {
            if event.keyCode == 124 && index < YOUR_DATASOURCE_ARRAY.count - 1 {
                self.deselectItems(at: [NSIndexPath(forItem: index, inSection: 0) as IndexPath])
                self.selectItems(at: [NSIndexPath(forItem: index + 1, inSection: 0) as IndexPath], scrollPosition: NSCollectionView.ScrollPosition.nearestHorizontalEdge)
                return
            }
            if event.keyCode == 123 && index > 0 {
                self.deselectItems(at: [NSIndexPath(forItem: index, inSection: 0) as IndexPath])
                self.selectItems(at: [NSIndexPath(forItem: index - 1, inSection: 0) as IndexPath], scrollPosition: NSCollectionView.ScrollPosition.nearestHorizontalEdge)
                return
            }
        }
    }
    super.keyDown(with: event)
}

Это прерывает ввод клавиш со стрелками влево и вправо и перемещает выбор на предыдущую/следующую ячейку. Поскольку «Разрешить множественный выбор» должно быть НЕТ. Также отключите клавиши-модификаторы, такие как CMD или Control.

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

person mohacs    schedule 25.10.2017
comment
Благодарю вас! Это помогло мне! - person niknamelogin; 27.10.2017