NSPopUpButton - неожиданные множественные галочки - PullRequest
0 голосов
/ 28 июня 2019

У меня есть NSPopUpButton, который ведет себя очень странно, независимо от того, как сильно я пытаюсь обновить выбранный элемент, используя selectItem(withTitle:) до @IBOutlet или используя привязку Какао до Selected Index, он всегда будет сохранять первый элемент проверено независимо от того, что я выбрал (таким образом, всегда проверено несколько элементов одновременно).

Here's an image for my NSPopUpButton with multiple items checked

Я определенно не ожидал, что это разрешит множественный выбор , и я не реализовал ничего, чтобы изменить поведение по умолчанию для этого NSPopUpButton. Единственное, что я реализовал для этого NSPopUpButton в своем классе ViewController, это метод делегата menuNeedsUpdate(_:). Вот мои реализации, связанные с этим NSPopUpButton:

РЕДАКТИРОВАТЬ : В моем первоначальном сообщении были некоторые проблемы с моим кодом, вот обновленная версия:

class ViewController: NSViewController, NSMenuDelegate {

    @IBOutlet weak var popUpButton: NSPopUpButton!

    // bound to content values, this represents the content of my NSPopUpButton
    @objc dynamic var popUpContent: [String] = [...]

    // bound to selected index, this is used to set the selected item of NSPopUpButton
    @objc dynamic var popUpSelectedIndex = 0

    var recentLocations: [String] = [] {
        didSet {
            // other codes defining new content for replacement
            popUpContent = newContent // updated content
        }
    }

    @IBAction func popUpButtonSelectedItemChanged(_ sender: NSPopUpButton) {
        // conditionally append to recentLocations
        if !recentLocations.contains(newValue) {
            recentLocations.append(newValue) // this triggers the recent locations didSet block
            // then the didSet block is gonna replace the content with a new content depending on the recent locations
            popUpSelectedIndex = popUpContent.firstIndex(of: newValue)! // then select the one that just added
        }
        // other code
    }

    // delegate
    func menuNeedsUpdate(_ menu: NSMenu) {
        for (index, item) in menu.items.enumerated() {
            if item.title == "" {
                menu.items[index] = .separator()
            }
            if item.title == "No Recent Locations" {
                menu.items[index].isEnabled = false
            }
        }
    }
}

Вот логика этого кода:

Когда пользователь открывает и выбирает новый элемент, он запускает popUpButtonSelectedItemChanged(_:), затем функция оценивает выбранный элемент и условно решает, что делать дальше, в зависимости от того, что выбрал пользователь. Например, если пользователь выбрал «Выбрать новое местоположение ...», то откроется панель выбора файлов, которая позволяет пользователю выбрать новое местоположение, а затем вновь выбранный путь будет добавлен в recentLocations, только если recentLocations еще не содержит это местоположение. Как только новый путь будет добавлен в recentLocations, он активирует блок didSet для recentLocations, который генерирует новый контент для NSPopUpButton в зависимости от новых недавних местоположений, а затем устанавливает popUpContent в новое содержание. Затем предыдущий popUpButtonSelectedItemChanged(_:) выберет тот, который только что был добавлен в popUpContent (через recentLocations 'didSet блок).

И еще одна странная вещь в этом NSPopUpButton заключается в том, что после того, как я открыл его меню и затем закрыл его, не выбирая какой-либо элемент в меню, он автоматически переключается на первый, независимо от того, что я выбрал в первое место (до его открытия).

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

...