编辑:我想出了如何防止这种情况,但我仍然有一个问题,为什么它返回一个可选值。你可以跳到最后。获取当前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
。
我查了一堆教程,看看他们如何实现弹出式按钮功能。我能看到的唯一的事情是,当有人
- 制造删除从弹出式菜单按钮所有元素的数组
- 与
func removeAllItems()
- 新增项目从数组弹出按钮,
func addItems(withTitles: [String])
- 下获得的指标与所选项目相符
var indexOfSelectedItem: Int
- 从数组中检索相应的值
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!
?
谢谢。但是,有一件事我不明白(你可以在我的编辑中看到):怎么可能没有选择什么?我只能看到选择Item1,Item2或Item3的可能性。这是不可能取消选择一个项目 –
另外,我意识到你用'如果让'打开它。就像我做的那样,这比使用'!'做得好还是差?后者似乎更简单 –
'NSPopUpButton'可以动态填充。如果该按钮不包含任何菜单项或者使用可可绑定,则该选择可能为空。如果你可以保证菜单永远不会空,并且你不使用Cocoa Bindings,你可以强制解包可选的('!') – vadian