首页 > 解决方案 > 如何使用完成按钮制作两个 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()
    }
}

标签: swift

解决方案


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

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

然后,当您在doneTappedand中调用委托方法时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
       }
    }
}

推荐阅读