Ich habe Schwierigkeiten, eine UIPickerView mit einer Schaltfläche "Fertig" so zu gestalten, dass sie angezeigt wird, wenn die Benutzer auf ein UITextField tippen. Dies ist mein bisheriger Code. Alles funktioniert gut, aber wenn ich auf das Textfeld tippe, wird die Tastatur angezeigt, nicht die Auswahl.
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()
}
}
ios
swift
uipickerview
Alberto O.
quelle
quelle
Antworten:
Fügen Sie diesen Code
viewDidLoad()
anstelle Ihrer Methode hinzulet 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.isTranslucent = true toolBar.tintColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 1) toolBar.sizeToFit() let doneButton = UIBarButtonItem(title: "Done", style: UIBarButtonItem.Style.done, target: self, action: #selector(self. donePicker)) let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: nil, action: nil) let cancelButton = UIBarButtonItem(title: "Cancel", style: UIBarButtonItem.Style.plain, target: self, action: #selector(self. donePicker)) toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false) toolBar.userInteractionEnabled = true textField1.inputView = picker textField1.inputAccessoryView = toolBar
quelle
Ich denke, es ist besser, eine benutzerdefinierte Klasse zu erstellen, um Code vom Controller zu entfernen.
Schnelles 4/5-Beispiel :
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() } }
Anwendungsbeispiel:
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() } }
quelle
didTapDone
unddidTapCancel
Methode, in derToolbarPickerView
Instanz zu übergeben; likefunc didTapDone(_ picker: ToolbarPickerView)
UIPickerView mit einer Schaltfläche Fertig? Swift4
Schritt 1: Hinzufügen einer Textdatei mit dem Namen txt_pickUpData in ViewController und Angeben der IBOutlet-Verbindung und des Delegaten. Nehmen Sie auch eine UIDatePicker-Variable. und nehmen Sie ein Array mit einem Zeichenfolgenwert, der auf dem Auswahlrad angezeigt wird.
@IBOutlet weak var txt_pickUpData: UITextField! var myPickerView : UIPickerView! var pickerData = ["Hitesh Modi" , "Kirit Modi" , "Ganesh Modi" , "Paresh Modi"]
Schritt 2: Fügen Sie auch den Delegaten von UIPickerView und UITextFiled hinzu.
class ViewController: UIViewController , UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate{
Schritt 3: Die Funktion pickUp zum Erstellen von UIPickerView mit 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 }
Schritt 4: Hinzufügen der Delegaten- und Datenquellenmethoden von UIPickerView, um Daten auf dem UIPickerView-Rad anzuzeigen.
//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) }
Schritt 5: Hinzufügen einer Methode mit zwei Schaltflächen, die sich in der Symbolleiste befindet. Einer ist doneClick und der andere ist cancelClick. Welches ist die UIPickerView entlassen.
func doneClick() { txt_pickUpData.resignFirstResponder() } func cancelClick() { txt_pickUpData.resignFirstResponder() }
Schritt 6: Aufrufen der Funktion pickUp in der UITextField-Delegatmethode.
func textFieldDidBeginEditing(_ textField: UITextField) { self.pickUp(txt_pickUpData) }
Kopieren Sie einfach Ihren Code und fügen Sie ihn ein.
quelle
@objc
vor IhrendoneClick
undcancelClick
Funktionen hinzufügen müssen.Die Leute scheinen den Code hier für andere Fragen zu verwenden, um dasselbe zu stellen, was VBaarathi gestellt hat
In 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))
Dann können Sie Folgendes in dieselbe schnelle Datei einfügen
func donePicker (sender:UIBarButtonItem) { // Put something here }
quelle
Swift 3x:
Die großartige Antwort ist bereits gegeben, aber hier ist der andere Ansatz, machen Sie einfach ein
pickerView
und geben Sie dasinputView
undinputAccessoryView
so: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] }
quelle