首页 > 解决方案 > 如何在选择器 Tapgesture 中使用参数

问题描述

目前我正在让 pickerDate 与 TextField 交互。

class ViewController: UIViewController {
    @IBOutlet weak var fromDateFilterTextField: UITextField!

    @IBOutlet weak var toDateFilterTextField: UITextField!
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()

    }
    private func setupUI(){
        fromDateFilterTextField.setInputViewDatePicker(target: self, selector: #selector(tapDone(_:)))
        toDateFilterTextField.setInputViewDatePicker(target: self, selector: #selector(tapDone(_:)))
    }

@objc func tapDone(textField : UITextField) {

}

}

extension UITextField{
    func setInputViewDatePicker(target : Any , selector : Selector){
        //create a UIDatePicker object and assign to inputView
        let screenWidth = UIScreen.main.bounds.width
        let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 0, width: screenWidth, height: 200))
        datePicker.datePickerMode = .date
        self.inputView = datePicker

        //create a toolbar and assign it to inputAccesoryView
        let toolBar = UIToolbar(frame: CGRect(x: 0.0, y: 0.0, width: screenWidth, height: 44.0))
        toolBar.barTintColor = .red
        datePicker.setValue(UIColor.black, forKeyPath: "textColor")
        datePicker.setValue(false, forKeyPath: "highlightsToday")
        datePicker.backgroundColor = .white

        let flexible = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let cancel = UIBarButtonItem(title: "Cancel", style: .plain, target: nil, action: #selector(tapCancel))
        cancel.tintColor = .white
        let barButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector) //7
        barButton.tintColor = .white
        toolBar.setItems([cancel, flexible, barButton], animated: false)
        self.inputAccessoryView = toolBar
    }
    @objc func tapCancel() {
        self.resignFirstResponder()
    }
}

我想将文本字段作为 tapDone 的参数传递以重用代码,因为我想仅使用更改 tapDone 的参数来更新不同文本字段的日期。

标签: swift

解决方案


好的,我(通常)了解您要做什么。简短的回答是,您不能将您的UITextField作为Selector由您执行的参数传递UIBarButtonItem。也就是说,还有其他选择。

我能想到的最简单的解决方案是使用你的 s 和s 的tag属性。要设置它,您需要更新每个的,以便它们都是唯一的。例如,您的 a 可能为 0,the可能为 1。如果您有更多,请确保它们彼此不同。UITextFieldUIBarButtonItemtagUITextFieldfromDateFilterTextFieldtagtoDateFilterTextField

一旦你更新了你的 textFields 上的标签,你可以UIBarButtonItem通过修改你的setInputViewDatePicker方法来确保它具有相同的标签,如下所示:

func setInputViewDatePicker(target : Any , selector : Selector){
    ...
    let barButton = UIBarButtonItem(title: "Done", style: .plain, target: target, action: selector) //7
    barButton.tintColor = .white
    //Make the barButton tag match the associated textField's tag
    barButton.tag = self.tag
    ...
}

即使你不能UITextField作为参数传递,你也可以通过改变你的选择器方法来传递UIBarButton执行,如下所示:Selector

@objc func tapDone(_ sender: UIBarButtonItem) {

}

tapDone然后,您可以通过查找该匹配标记来确定哪个 textField 与 关联:

@objc func tapDone(_ sender: UIBarButtonItem) {
  switch sender.tag {
  case 0:
    print("This is fromDateFilterTextField")
  case 1:
    print("This is toDateFilterTextField")
  default:
    print("This is a different textField")
  }
}

您也可以viewWithTag文档中查看可能的改进,尽管有时非常明确会使您的代码更具可读性并且不易出现错误。


推荐阅读