swift - 如何在选择器 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 的参数来更新不同文本字段的日期。
解决方案
好的,我(通常)了解您要做什么。简短的回答是,您不能将您的UITextField
作为Selector
由您执行的参数传递UIBarButtonItem
。也就是说,还有其他选择。
我能想到的最简单的解决方案是使用你的 s 和s 的tag
属性。要设置它,您需要更新每个的,以便它们都是唯一的。例如,您的 a 可能为 0,the可能为 1。如果您有更多,请确保它们彼此不同。UITextField
UIBarButtonItem
tag
UITextField
fromDateFilterTextField
tag
toDateFilterTextField
一旦你更新了你的 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
在文档中查看可能的改进,尽管有时非常明确会使您的代码更具可读性并且不易出现错误。