Метод NSRegularExpression firstMatch не работает с пользовательским UIPickerView Swift - PullRequest
0 голосов
/ 21 апреля 2019

У меня есть ВК, где мне нужно проверить, что пользователь выбирает регулярные выражения с помощью пользовательского 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})

Где проблема в моем коде?

...