Я пытаюсь создать 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
и оставил их отмеченными, даже если я выбрал что-то еще, в конечном итоге это выглядит примерно так:
А также если я открою меню(NSPopUpButton
) и непосредственно закройте его, не выбирая ни одного элемента в меню (щелкните в любом месте, кроме меню), он автоматически выбирает первый элемент («Нет») независимо от ранее выбранного элемента.
Затем я решил проконтролировать значение для selectedIndex
после закрытия меню, введя menuDidClose(_:)
, получается selectedIndex
именно то, что я выбрал ранее (что правильно). Эта проблема сохраняется даже после того, как я удалил привязку для selectedIndex
.
Это действительно странно и не имеет никакого смысла. Кто-нибудь может объяснить, что происходит с этим? И как правильно заполнить NSPopUpButton
смесью статического и динамического содержимого?