如何使用"完成"按钮制作两个UIPickerView"



我在将"完成"按钮应用于拾取器时遇到问题。

我一直在研究中提供的解决方案[https://stackoverflow.com/a/52777282/9383241][1] 但这只给出了一个页面上有一个选择器的示例。在我的用例中有两个picker,我使用标签来区分它们,标签用于定义"picker"中的函数;扩展MyViewController:UIPickerViewDataSource,UIPickerView Delegate"-但我不确定如何使用";扩展MyViewController:ToolbarPickerViewDelegate{quot;

我可以看到有人评论说";didTapDone和didTapCancel方法最好在ToolbarPickerView实例中传递;类似于func didTapDone(_ picker:ToolbarPickerView("lt;---我认为这是我需要的,但我不知道怎么做。

这是我只为textField1工作的代码,我在评论中包括了我如何考虑构建我的代码,以实现我的两个pickers的didTapDone和didTapCancel。

import UIKit
class MyViewController: UIViewController {
@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!

fileprivate let pickerView1 = ToolbarPickerView()
fileprivate let pickerView2 = ToolbarPickerView()
fileprivate let titles1 = ["0", "1", "2", "3"]
fileprivate let titles2 = ["9", "8", "7", "6"]

override func viewDidLoad() {
super.viewDidLoad()
self.textField1.inputView = self.pickerView1
self.textField1.inputAccessoryView = self.pickerView1.toolbar
self.textField2.inputView = self.pickerView2
self.textField2.inputAccessoryView = self.pickerView2.toolbar
self.pickerView1.dataSource = self
self.pickerView1.delegate = self
self.pickerView1.toolbarDelegate = self
self.pickerView1.tag = 1
self.pickerView1.reloadAllComponents()
self.pickerView2.dataSource = self
self.pickerView2.delegate = self
self.pickerView2.toolbarDelegate = self
self.pickerView2.tag = 2
self.pickerView2.reloadAllComponents()
}
}
extension MyViewController: UIPickerViewDataSource, UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
switch pickerView.tag {
case 1:
return self.titles1.count
case 2:
return self.titles2.count
default:
return 1
}
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
switch pickerView.tag {
case 1:
return self.titles1[row]
case 2:
return self.titles2[row]
default:
return ""
}

}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch pickerView.tag {
case 1:
self.textField1.text = self.titles1[row]
case 2:
self.textField2.text = self.titles2[row]
default:
break
}
}
}
extension MyViewController: ToolbarPickerViewDelegate {
func didTapDone() {
//   switch pickerView.tag { // <--- I don't know how to get this into the function to be read here
//   case 1:
let row = self.pickerView1.selectedRow(inComponent: 0)
self.pickerView1.selectRow(row, inComponent: 0, animated: false)
self.textField1.text = self.titles1[row]
self.textField1.resignFirstResponder()
/*   case 2:
let row = self.pickerView2.selectedRow(inComponent: 0)
self.pickerView2.selectRow(row, inComponent: 0, animated: false)
self.textField2.text = self.titles2[row]
self.textField2.resignFirstResponder()
default:
break
}*/
}
func didTapCancel() {
//   switch pickerView.tag { // <--- I don't know how to get this into the function to be read here
//   case 1:
self.textField1.text = nil
self.textField1.resignFirstResponder()
/*   case 2:
self.textField2.text = nil
self.textField2.resignFirstResponder()
default:
break
}*/
}
}

和一个没有更改ToolbarPickerView代码的直接副本:

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

首先,将参数添加到委托方法声明中:

protocol ToolbarPickerViewDelegate: class {
func didTapDone(pickerView: ToolbarPickerView)
func didTapCancel(pickerView: ToolbarPickerView)
}

然后,当您调用doneTappedcancelTapped中的委托方法时,您还传入self:

@objc func doneTapped() {
self.toolbarDelegate?.didTapDone(pickerView: self)
}
@objc func cancelTapped() {
self.toolbarDelegate?.didTapCancel(pickerView: self)
}

现在你可以在你的VC:中检查标签

extension MyViewController: ToolbarPickerViewDelegate {
func didTapDone(pickerView: ToolbarPickerView) {
switch pickerView.tag {
case 1:
let row = self.pickerView1.selectedRow(inComponent: 0)
self.pickerView1.selectRow(row, inComponent: 0, animated: false)
self.textField1.text = self.titles1[row]
self.textField1.resignFirstResponder()
case 2:
let row = self.pickerView2.selectedRow(inComponent: 0)
self.pickerView2.selectRow(row, inComponent: 0, animated: false)
self.textField2.text = self.titles2[row]
self.textField2.resignFirstResponder()
default:
break
}
}
func didTapCancel(pickerView: ToolbarPickerView) {
switch pickerView.tag {
case 1:
self.textField1.text = nil
self.textField1.resignFirstResponder()
case 2:
self.textField2.text = nil
self.textField2.resignFirstResponder()
default:
break
}
}
}

最新更新