2017-07-29 101 views
0

编辑:我想出了如何防止这种情况,但我仍然有一个问题,为什么它返回一个可选值。你可以跳到最后。获取当前NSPopUpButton的选择与titleOfSelectedItem返回“可选值”

我对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)行给了我这个神秘的错误:

Expression explicitly coerced from 'String?' to Any

而且,我不能做这样的事情:

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

,因为我得到了一堆错误 - 因为||和据我所知,尽管我认为它应该可以正常工作,但仍然是else

我试过寻找为什么发生这种情况,但找不到任何解释。从警告,似乎当我得到titleOfSelectedItem选择,它给了我一个可选价值。这是没有意义的,因为菜单项已经选择了。它的值不能是nil

我查了一堆教程,看看他们如何实现弹出式按钮功能。我能看到的唯一的事情是,当有人

  1. 制造删除从弹出式菜单按钮所有元素的数组
  2. func removeAllItems()
  3. 新增项目从数组弹出按钮,func addItems(withTitles: [String])
  4. 下获得的指标与所选项目相符var indexOfSelectedItem: Int
  5. 从数组中检索相应的值

and then used that。然而,这似乎不必要的复杂,我不明白为什么我不能简单地通过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

titleOfSelectedItem返回可选项,因为不能选择项目。

您需要选购绑定安全解开可选的,你必须对标题字符串同时评估“项目1”和“项目3”:

if let title = myButton.titleOfSelectedItem { 

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


} 
+0

谢谢。但是,有一件事我不明白(你可以在我的编辑中看到):怎么可能没有选择什么?我只能看到选择Item1,Item2或Item3的可能性。这是不可能取消选择一个项目 –

+0

另外,我意识到你用'如果让'打开它。就像我做的那样,这比使用'!'做得好还是差?后者似乎更简单 –

+0

'NSPopUpButton'可以动态填充。如果该按钮不包含任何菜单项或者使用可可绑定,则该选择可能为空。如果你可以保证菜单永远不会空,并且你不使用Cocoa Bindings,你可以强制解包可选的('!') – vadian