NSPopUpButton - странное поведение при заполнении динамического содержимого с помощью привязки какао - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь создать NSPopUpButton с динамическим содержимым, это мой дизайн:

+-------------+
| None        | <-- Static
| Last Item   | <-- Static
|-------------| <-- Separator
| History:    | <-- Dynamic: "History:" / "No History"
| ...         | <-- Dynamic
+-------------+

А вот мой код для ViewController.swift:

class ViewController: NSViewController, NSMenuDelegate {

    @objc dynamic var contents: [String] = ["None", "Last Item", ""]
    @objc dynamic var selectedIndex: Int = 0

    func updateContent() {
        // update contents array
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        updateContent()
        // other code
    }

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

    func menuDidClose(_ menu: NSMenu) {
        print(selectedIndex)
    }
}

Я сделалПривязки какао с помощью построителя интерфейса. Мои NSPopUpButton Content Values привязаны к свойству contents, Selected Index привязаны к selectedIndex. Я установил объект ViewController в качестве делегата для встроенного NSPopUpButton NSMenu.

Итак, нет проблем с содержимым NSPopUpButton, но он проверяет любой элемент, который я выбрал вNSPopUpButton и оставил их отмеченными, даже если я выбрал что-то еще, в конечном итоге это выглядит примерно так:

Unexpected multiple selections with NSPopUpButton

А также если я открою меню(NSPopUpButton) и непосредственно закройте его, не выбирая ни одного элемента в меню (щелкните в любом месте, кроме меню), он автоматически выбирает первый элемент («Нет») независимо от ранее выбранного элемента.

Automatically selected 'None' item

Затем я решил проконтролировать значение для selectedIndex после закрытия меню, введя menuDidClose(_:), получается selectedIndex именно то, что я выбрал ранее (что правильно). Эта проблема сохраняется даже после того, как я удалил привязку для selectedIndex.

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

1 Ответ

0 голосов
/ 04 октября 2019

Проблема вызвана menu.items[index] = .separator(). Он заменяет массив элементов меню. Свойство itemArray всплывающей кнопки указывает на массив элементов меню, и это свойство не настраивается. Всплывающая кнопка не может найти пункт меню для отключения галочки. Замените пункт меню на

menu.removeItem(at: index)
menu.insertItem(NSMenuItem.separator(), at: index)

Или поместите разделительный элемент в меню в IB и используйте настройку привязки содержимого Tag для привязки элементов под разделителем.

...