swift - 如何使用完成按钮制作两个 UIPickerView
问题描述
我无法将“完成”按钮应用于我的选择器。
我一直在研究 [https://stackoverflow.com/a/52777282/9383241][1] 中提供的解决方案,但这仅提供了一个页面上有一个选择器的示例。我的用例中有两个选择器,我使用标签区分它们,这些标签用于定义“扩展 MyViewController:UIPickerViewDataSource,UIPickerViewDelegate”中的函数 - 但我不确定如何使用“扩展 MyViewController:ToolbarPickerViewDelegate {”中的标签
我可以看到有人评论说“didTapDone 和 didTapCancel 方法可能更好地传递 ToolbarPickerView 实例;比如 func didTapDone(_ picker: ToolbarPickerView)”<--- 我认为这是我需要的,但我不不知道该怎么做。
这是我的代码仅适用于 textField1,我在评论中包含了我是如何考虑构建我的代码以实现我的两个选择器的 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)
}
然后,当您在doneTapped
and中调用委托方法时cancelTapped
,您还会传入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
}
}
}
推荐阅读
- javascript - 转换多个打开时间和减少单个打开时间的问题
- sql - 根据大于子句更新 Select 中的值
- heroku - 将 Flask 应用程序部署到 Heroku 的困难
- java - 使用 Webflux 实现 POST
- java - 在java中将字符串输入到二维数组中
- python - 如何从一个元素执行 Python Selenium 多次循环?
- swift - 从 Firebase 获取图像时,tableView 不会滚动到 Swift 行
- java - 创建线程时Java内存不足错误
- javascript - 如何在卡片列表中添加无限滚动?[反应JS]
- python - LeetCode 问题 135 糖果一次性解法,求给每个孩子的糖果数量