ResignFirstResponder для UIPicker в UITextField Swift

Я хочу, чтобы UIPickerView был уволен (выйдет из поля зрения) после нажатия кнопки "Готово" на панели инструментов. Я связал UIPickerView как входной элемент UITextField и установил UIToolbar в качестве входного окна просмотра UIPickerView. Однако моя функция, вызывающая resignFirstResponder, не выводит UIPicker из представления. Любая помощь приветствуется и благодарит заранее!

import UIKit

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    // Do any additional setup after loading the view, typically from a nib.

    //initialization constants
    let pickerView = UIPickerView()
    let textField = UITextField()
    let pickerData = ["1","2","three"]


    override func viewDidLoad() {
        //pickerview tool bar
        let toolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 44))
        var items = [AnyObject]()
        //making done button
        let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: Selector(donePressed()))
        items.append(doneButton)
        toolbar.barStyle = UIBarStyle.Black
        toolbar.setItems(items, animated: true)


        //creating textfields with a pickerview
        pickerView.delegate = self
        pickerView.dataSource = self
        pickerView.frame = CGRectMake(0, 0, 500, 300)
        textField.inputAccessoryView = toolbar
        textField.inputView = pickerView
        textField.frame = CGRectMake(200, 55, 100, 35)
    textField.backgroundColor = UIColor.blueColor()

    //adding objs to viewController
    self.view.addSubview(textField)
}

func donePressed() {
    resignFirstResponder()
}





override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



}

//MARK: Data Sources UIPickerView
extension ViewController: UIPickerViewDataSource {
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }
}

//MARK: Delegates UIPickerView
extension ViewController: UIPickerViewDelegate {
    // several optional methods:




func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    return pickerData[row]
}

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) {
    textField.text = pickerData[row]
}
}

Ответ 1

Есть 2 проблемы:

  • Ваш селектор для donePressed объявлен неверно. Это должно быть:

    let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "donePressed")
    
  • Вам нужно позвонить resignFirstResponder() на textField:

    func donePressed() {
        textField.resignFirstResponder()
    }
    

Если у вас есть несколько текстовых полей, и вы не хотите жестко закодировать textField в вызове resignFirstResponder, вы можете сделать следующее:

  • Сделайте ViewController a UITextFieldDeletate:

    class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {
    
  • Задайте свойство delegate на UITextField:

    textField.delegate = self
    
  • Добавьте свойство в ViewController для отслеживания активного UITextField:

    var activeTextField:UITextField?
    
  • Внесите textFieldDidBeginEditing и сохраните активный UITextField:

    func textFieldDidBeginEditing(textField: UITextField) { // became first responder
        activeTextField = textField
    }
    
  • В donePressed вызовите resignFirstResponder на activeTextField:

    func donePressed() {
        activeTextField?.resignFirstResponder()
    }