Клавиатура иногда отображается в окне выбора текстового поля в iOS - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть текстовое поле, которое при нажатии отображает UIPickerView.Я добавляю это как inputView текстового поля.Иногда, когда я нажимаю на текстовое поле, вместо экрана выбора отображается клавиатура.Я добавил пользовательский класс, который также подклассов UITextField.

override func viewDidLoad() {
    // ...
    monthTextField.addTarget(self, action: #selector(monthTextFieldDidTap), for: UIControl.Event.touchDown)
}


@objc func monthTextFieldDidTap(textField: UITextField) {
    activePickerType = PickerType.month
    viewDatePicker(textField)
}

@objc func yearTextFieldDidTap(textField: UITextField) {
    activePickerType = PickerType.year
    viewDatePicker(textField)
}

func viewDatePicker(_ textField: UITextField) {
    self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
    self.datePicker.delegate = self
    self.datePicker.dataSource = self
    textField.inputView = self.datePicker
    // ...
}

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if (textField == monthTextField) {
        return true
    }
    return false
}

Пользовательский подкласс UITextField:

class PickerTextField: UITextField {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func caretRect(for position: UITextPosition) -> CGRect {
        return CGRect.zero
    }

    func selectionRects(for range: UITextRange) -> [Any] {
        return []
    }

    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        UIMenuController.shared.isMenuVisible = false
        self.resignFirstResponder()
        return false
    }
}

Как убедиться, что клавиатура не отображается, когданажмите на UITextField и всегда отображать UIPickerView?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Добавьте строку self.view.endEditing () в функции monthTextFieldDidTap (textField: UITextField), как показано ниже:

@objc func monthTextFieldDidTap(textField: UITextField) {
    self.view.endEditing(true)
    monthTextField.tintColor = UIColor.clear    //optional to use. It just removes cursor blinking on picker Textfield
    self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
    self.datePicker.delegate = self
    self.datePicker.dataSource = self
    textField.inputView = self.datePicker
    // ...
}
0 голосов
/ 12 февраля 2019

Поместите эти строки в viewDidLoad вместо monthTextFieldDidTap

self.datePicker = UIPickerView.init(frame: CGRect.init(x: 0, y: 0, width: self.navigationController!.view.frame.size.width, height: 216))
self.datePicker.delegate = self
self.datePicker.dataSource = self
monthTextField.inputView = self.datePicker



func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if (textField == monthTextField) {
    activePickerType = PickerType.month
    viewDatePicker(textField)

}
return true

}

...