如果我们试图在swift/objective-c中创建一个NSPopupButton,我们会发现如果我们不将pullsdown设置为false,那么一旦选择了第一个项目以外的项目,您将永远无法再选择第一个项目。

class PopupButton: NSPopUpButton {

    let items = ["item 1", "item 2", "item 3"]

    override init(frame buttonFrame: NSRect, pullsDown flag: Bool) {
        super.init(frame: buttonFrame, pullsDown: flag)

        items.forEach { item in
            menu?.addItem(withTitle: item, action: #selector(handleSelectedItem(_:)), keyEquivalent: "")
        }
    }

    @objc private func handleSelectedItem(_ selectedItem: NSMenuItem) {
        title = selectedItem.title
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

我有办法解决这个问题吗?
(注意:我不希望回答将pullsDown设置为false并且问题已修复。我需要保持弹出按钮的行为符合预期。)

最佳答案

Documentation archive,这就是下拉按钮的工作方式。它更像一个菜单-标题不是基于所选内容,只有当您显式设置标题时,标题才会更改。列表实际上从索引1开始-索引0可用于存储标题(尽管您仍应设置它),这就是为什么列表中的第一个项未在菜单中使用的原因。

10-08 08:05