編輯:我想出瞭如何防止這種情況,但我仍然有一個問題,爲什麼它返回一個可選值。你可以跳到最後。獲取當前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