У меня есть ВК, где мне нужно проверить, что пользователь выбирает регулярные выражения с помощью пользовательского UIPickerView
.Но regex validate не работает с моим пользовательским UIPickerView
.Почему?
Мой ВК:
class NewItemViewController: UIViewController {
@IBOutlet weak var itemCategoryTextField: UITextField!
private var itemQuantityTypePicker: ItemQuantityTypePicker!
private var itemQuantityTypePickerView = UIPickerView()
override func viewDidLoad() {
super.viewDidLoad()
let toolbar = UIToolbar().toolbarPicker(mySelect: #selector(dismissPicker))
itemQuantityTypePicker = ItemQuantityTypePicker()
itemQuantityTypePicker.setTextField(textField: itemQuantityTypeTextField)
itemQuantityTypePickerView.delegate = itemQuantityTypePicker
itemQuantityTypePickerView.dataSource = itemQuantityTypePicker
itemQuantityTypePickerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: 216)
itemQuantityTypeTextField.delegate = self
itemQuantityTypeTextField.inputAccessoryView = toolbar
itemQuantityTypeTextField.inputView = itemQuantityTypePickerView
itemQuantityTypeTextField.text = itemQuantityTypePickerView.delegate?.pickerView!(itemQuantityTypePickerView, titleForRow: 0, forComponent: 0)
let itemQuantityTypeValidator = TextValidator(input: itemQuantityTypeTextField.rx.text.asObservable(), regex: try! NSRegularExpression(pattern: "[A-Za-z]"))
}
}
TextValidator:
class TextValidator {
var input: Observable<String?>
var regex: NSRegularExpression
init(input: Observable<String?>, regex: NSRegularExpression) {
self.input = input
self.regex = regex
}
func validate() -> Observable<Bool> {
return input.map { text in
guard let text = text else { return false }
let range = NSRange(text.startIndex..., in: text)
print(text)
print(self.regex.firstMatch(in: text, options: [], range: range))
return self.regex.firstMatch(in: text, options: [], range: range) != nil
}
}
}
Когда я выбираю строку в pickerViewКонсоль показывает:
Мой выбор
ноль
Почему ноль?Мой выбранный элемент отображается правильно:
print(text) // My choose
Мой пользовательский pickerView:
class ItemQuantityTypePicker: UIPickerView {
let itemQuantityTypeData = ["My choose", "My choose 2", "My choose 3"]
var textField: UITextField?
func setTextField(textField: UITextField) {
self.textField = textField
}
}
extension ItemQuantityTypePicker: UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return itemQuantityTypeData.count
}
}
extension ItemQuantityTypePicker: UIPickerViewDelegate {
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return itemQuantityTypeData[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.textField?.text = itemQuantityTypeData[row]
}
}
Но проверка регулярного выражения для datePicker
работает правильно:
datePicker = UIDatePicker()
datePicker?.datePickerMode = .date
datePicker?.addTarget(self, action: #selector(datePickerValueChanged(sender:)), for: .valueChanged)
itemDateTextField.delegate = self
itemDateTextField.inputView = datePicker
itemDateTextField.inputAccessoryView = toolbar
let itemDateValidator = TextValidator(input: itemDateTextField.rx.text.asObservable(), regex: try! NSRegularExpression(pattern:
#"^\s*(3[01]|[12][0-9]|0?[1-9])\.(1[012]|0?[1-9])\.((?:19|20)\d{2})\s*$"#))
@objc func datePickerValueChanged(sender: UIDatePicker) {
foodShelfLifeTextField.text = getStringFromDate(foodDate: sender.date)
}
результат:
21.06.2019
Необязательно ({0, 10} {^ \ s * (3 [01] | [12] [0-9] | 0 [1-9]) (1 [012] | 0 [1-9]) ((?: 19 |?. 20)?. \ д {2}) \ S * $0x0})
Где проблема в моем коде?