2017-07-29 100 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