NSPopUpButton-意外的多个复选标记

时间:2019-06-28 15:26:44

标签: swift cocoa nspopupbutton

无论是我多么努力尝试使用NSPopUpButtonselectItem(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尚未包含该位置的情况下,{1}}。将新路径添加到recentLocations后,它将触发recentLocations的{​​{1}}块,并根据最近的新位置为didSet生成新内容,然后将recentLocations设置为新内容。然后,前一个NSPopUpButton将选择刚刚添加到popUpContent中的那个(通过popUpButtonSelectedItemChanged(_:)的{​​{1}}块)。

关于此popUpContent的另一件事很奇怪,就是我打开菜单后,没有选择菜单中的任何项目就关闭它,无论我做什么,它都会自动选择回到第一个首先选择(在打开之前)

我首先想到代码中的某个地方可能会覆盖选定的项目,但是在重新构建所有相关逻辑并尝试了不同的方法之后,问题仍然存在。有人知道这种奇怪行为的可能原因是什么吗?

0 个答案:

没有答案