У меня есть NSPopUpButton
, который ведет себя очень странно, независимо от того, как сильно я пытаюсь обновить выбранный элемент, используя selectItem(withTitle:)
до @IBOutlet
или используя привязку Какао до Selected Index
, он всегда будет сохранять первый элемент проверено независимо от того, что я выбрал (таким образом, всегда проверено несколько элементов одновременно).
![Here's an image for my NSPopUpButton with multiple items checked](https://i.stack.imgur.com/NV0Ey.png)
Я определенно не ожидал, что это разрешит множественный выбор , и я не реализовал ничего, чтобы изменить поведение по умолчанию для этого 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
заключается в том, что после того, как я открыл его меню и затем закрыл его, не выбирая какой-либо элемент в меню, он автоматически переключается на первый, независимо от того, что я выбрал в первое место (до его открытия).
Сначала я подумал, что, возможно, где-то в моем коде переопределяется выбранный элемент, но проблема не исчезла после того, как я перестроил все связанные логики и попробовал разные способы. Кто-нибудь знает, каковы возможные причины такого странного поведения?