with uipicker pickerview example ios swift uipickerview

ios - uipicker - uitextfield picker



¿Cómo hacer un UIPickerView con un botón Listo? (5)

Agregue este código a su viewDidLoad() lugar de método

let picker: UIPickerView picker = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 300)) picker.backgroundColor = .whiteColor() picker.showsSelectionIndicator = true picker.delegate = self picker.dataSource = self let toolBar = UIToolbar() toolBar.barStyle = UIBarStyle.Default toolBar.translucent = true toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) toolBar.sizeToFit() let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker") let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker") toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.userInteractionEnabled = true textField1.inputView = picker textField1.inputAccessoryView = toolBar

Tengo dificultades para hacer que aparezca un UIPickerView con un botón listo cuando los usuarios tocan un UITextField. Este es mi código hasta ahora. Todo funciona bien, pero cuando toco el campo de texto, aparece el teclado, no el selector.

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { @IBOutlet var textField1: UITextField! let pickerData = ["11", "12", "13"] @IBAction func textButton(sender: AnyObject) { let picker: UIPickerView picker = UIPickerView(frame: CGRectMake(0, 200, view.frame.width, 300)) picker.backgroundColor = .whiteColor() picker.showsSelectionIndicator = true picker.delegate = self picker.dataSource = self let toolBar = UIToolbar() toolBar.barStyle = UIBarStyle.Default toolBar.translucent = true toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) toolBar.sizeToFit() let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker") let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.Plain, target: self, action: "donePicker") toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.userInteractionEnabled = true textField1.inputView = picker textField1.inputAccessoryView = toolBar } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { return 1 } func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerData.count } func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return pickerData[row] } func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { textField1.text = pickerData[row] } func donePicker() { textField1.resignFirstResponder() } }


Creo que es mejor hacer una clase personalizada para eliminar el código del controlador.

Swift 4/5 ejemplo :

import Foundation import UIKit protocol ToolbarPickerViewDelegate: class { func didTapDone() func didTapCancel() } class ToolbarPickerView: UIPickerView { public private(set) var toolbar: UIToolbar? public weak var toolbarDelegate: ToolbarPickerViewDelegate? override init(frame: CGRect) { super.init(frame: frame) self.commonInit() } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.commonInit() } private func commonInit() { let toolBar = UIToolbar() toolBar.barStyle = UIBarStyle.default toolBar.isTranslucent = true toolBar.tintColor = .black toolBar.sizeToFit() let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(self.doneTapped)) let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(self.cancelTapped)) toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.isUserInteractionEnabled = true self.toolbar = toolBar } @objc func doneTapped() { self.toolbarDelegate?.didTapDone() } @objc func cancelTapped() { self.toolbarDelegate?.didTapCancel() } }

Ejemplo de uso:

class MyViewController: UIViewController { @IBOutlet weak var textField: UITextField! fileprivate let pickerView = ToolbarPickerView() fileprivate let titles = ["0", "1", "2", "3"] override func viewDidLoad() { super.viewDidLoad() self.textField.inputView = self.pickerView self.textField.inputAccessoryView = self.pickerView.toolbar self.pickerView.dataSource = self self.pickerView.delegate = self self.pickerView.toolbarDelegate = self self.pickerView.reloadAllComponents() } } extension MyViewController: UIPickerViewDataSource, UIPickerViewDelegate { func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return self.titles.count } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return self.titles[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { self.textField.text = self.titles[row] } } extension MyViewController: ToolbarPickerViewDelegate { func didTapDone() { let row = self.pickerView.selectedRow(inComponent: 0) self.pickerView.selectRow(row, inComponent: 0, animated: false) self.textView.text = self.titles[row] self.textField.resignFirstResponder() } func didTapCancel() { self.textField.text = nil self.textField.resignFirstResponder() } }


La gente parece estar usando el código aquí para otras preguntas para hacer lo mismo que VBaarathi preguntó

En Swift3

let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItemStyle.plain, target: self, action: #selector(donePicker)) let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItemStyle.plain, target: self, action: #selector(donePicker))

Luego puede poner lo siguiente en el mismo archivo rápido

func donePicker (sender:UIBarButtonItem) { // Put something here }


Swift 3x:

La asombrosa respuesta ya está dada, pero aquí está el enfoque diferente, solo haga un pickerView y proporcione inputView y inputAccessoryView esta manera:

YOUR_TEXTFIELD_NAME.inputView = picker func addKeyboardToolBar() { var nextButton: UIBarButtonItem? var keyboardToolBar = UIToolbar(frame: CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(pickerView.frame.size.width), height: CGFloat(25))) keyboardToolBar.sizeToFit() keyboardToolBar.barStyle = .default daysHourTextField.inputAccessoryView = keyboardToolBar nextButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(self.textFieldShouldReturn)) keyboardToolBar.items = [UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil), nextButton] }


UIPickerView con un botón Listo? Swift4

Paso 1: Agregue un archivo de texto llamado txt_pickUpData en ViewController y delegue y conecte IBOutlet. También tome una variable UIDatePicker. y tome una matriz con el valor de cadena que se muestra en la rueda de selección.

@IBOutlet weak var txt_pickUpData: UITextField! var myPickerView : UIPickerView! var pickerData = ["Hitesh Modi" , "Kirit Modi" , "Ganesh Modi" , "Paresh Modi"]

Paso 2: También agrega el delegado de UIPickerView y UITextFiled.

class ViewController: UIViewController , UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate{

Paso 3: La función pickup para crear UIPickerView con ToolBar.

func pickUp(_ textField : UITextField){ // UIPickerView self.myPickerView = UIPickerView(frame:CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216)) self.myPickerView.delegate = self self.myPickerView.dataSource = self self.myPickerView.backgroundColor = UIColor.white textField.inputView = self.myPickerView // ToolBar let toolBar = UIToolbar() toolBar.barStyle = .default toolBar.isTranslucent = true toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1) toolBar.sizeToFit() // Adding Button ToolBar let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.doneClick)) let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) let cancelButton = UIBarButtonItem(title: "Cancel", style: .plain, target: self, action: #selector(ViewController.cancelClick)) toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.isUserInteractionEnabled = true textField.inputAccessoryView = toolBar }

Paso 4: Agregar los métodos de delegado y fuente de datos de UIPickerView para mostrar datos en la rueda UIPickerView.

//MARK:- PickerView Delegate & DataSource func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return pickerData.count } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return pickerData[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { self.txt_pickUpData.text = pickerData[row] } //MARK:- TextFiled Delegate func textFieldDidBeginEditing(_ textField: UITextField) { self.pickUp(txt_pickUpData) }

Paso 5: Agregar el método de dos botones que está en ToolBar. Uno es doneClick y otro es cancelClick. Lo cual es descartar el UIPickerView.

func doneClick() { txt_pickUpData.resignFirstResponder() } func cancelClick() { txt_pickUpData.resignFirstResponder() }

Paso 6: Llamar a la función de recogida en el método delegado UITextField.

func textFieldDidBeginEditing(_ textField: UITextField) { self.pickUp(txt_pickUpData) }

Simplemente copie y pegue su código.