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()
}