使用titleOfSelectedItem获取当前NSPopUpButton的选择将返回“可选值”

时间:2017-07-29 10:05:23

标签: swift

编辑:我想出了如何防止这种情况,但我仍然有一个问题,为什么它返回一个可选值。你可以跳到最后。

我对Swift很新,而且我得到了我无法理解的行为。假设我将一个名为myButton的弹出按钮拖到ViewController中。我想将当前选定的项目打印到控制台。我就是这样做的:

  @IBOutlet weak var myButton: NSPopUpButton!

  override func viewDidLoad() {
    super.viewDidLoad()

    let myVariable = myButton.titleOfSelectedItem
    print(myVariable)

    // Do any additional setup after loading the view.
  }

我希望打印Item1,因为这是加载视图时默认选择的选项。但是,我实际上得到Optional("Item 1")

这给我带来了一些问题。例如,print(myVariable)行给了我这个神秘的错误:

  

表达式是否明确强制来自'String?'任何

另外,我做不到这样的事情:

if myButton.titleOfSelectedItem == "Item1" || "Item3" {
  let currentSelection = "odd"
} else {
  let currentSelection = "even"
}

因为我得到了一堆错误 - 因为||else据我所知,即使我认为它应该可以正常工作。

我试过搜索发生这种情况的原因,但找不到任何解释。从警告中可以看出,当我使用titleOfSelectedItem进行选择时,它会为我提供可选值。这没有意义,因为要选择菜单项 。其值不能为nil

我查了一堆教程,看看它们是如何实现弹出按钮功能的。我唯一能看到的就是有人

  1. 制作阵列
  2. 使用func removeAllItems()
  3. 从弹出按钮中删除所有项目
  4. 使用func addItems(withTitles: [String])
  5. 从数组的弹出按钮添加了项目
  6. 使用var indexOfSelectedItem: Int
  7. 获取所选项目的索引
  8. 从数组中检索相应的值
  9. 然后使用它。然而,这似乎不必要地复杂化,我无法理解为什么我不能仅使用myButton.titleOfSelectedItem获得所选弹出项目的标题。谁能建议我做什么?

    修改

    所以我意识到你需要“解包”可选值以使其成为正常值,这就像在变量末尾添加!一样简单,如下所示:

      @IBOutlet weak var myButton: NSPopUpButton!
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        let myVariable = myButton.titleOfSelectedItem!
        print(myVariable)
    
        // Do any additional setup after loading the view.
      }
    

    现在没有错误,并且打印了Item1

    我还不能理解的是,为什么首先打印一个可选值? NSPopUpButton中有三个项目。三个中的任何一个都有被选中。 myButton.titleOfSelectedButton没有机会成为nil。为什么我需要打开它以将其用作myButton.titleOfSelectedButton!的字符串,如果它不是可选的?

1 个答案:

答案 0 :(得分:1)

titleOfSelectedItem返回一个可选项,因为无法选择任何项目。

你需要可选的绑定来安全地打开选项,你必须对标题字符串评估“Item1”和“Item3”:

if let title = myButton.titleOfSelectedItem {

    print(title)
    let currentSelection : String
    if title == "Item1" || title == "Item3" {
       currentSelection = "odd"
    } else {
       currentSelection = "even"
    }


}