UITextField в UITableViewCell и стать FirstResponder на выбранной клавиатуре ячейки показать / скрыть сбой

У меня есть такая иерархия представлений:

Контроллер представления

UITableView

UITableViewCell

UITextField

У меня в моем обычае UITableViewCell textField и мой план состоит в том, чтобы сделать это textField стать FirstResponder, как только пользователь нажмет на ячейку. Первая проблема заключается в том, что textField происходит касание событий, и ячейка не выбирается из-за этого, поэтому, когда пользователь нажимает прямо на textField ячейка не выбрана, и я не могу обновить выбранный интерфейс ячейки. Я думаю, что я могу сделать isUserInteractionEnabled=false на textField так после того, как пользователь нажимает на textField У меня будет правильный выбор поведения в моих клетках. Все идет нормально. Теперь я хочу обработать этот выбор в setSelected метод в моей пользовательской ячейке. Проблема в том, что если клавиатура уже на экране, и я выполняю becomeFirstResponder() на textField затем клавиатура прячется и сразу же появляется снова. Обычно я ожидаю, что эта клавиатура останется на своем месте, не пытаясь скрыть и показать снова. Вот код:

class StringFieldTableViewCell: UITableViewCell {

    @IBOutlet weak var pinLine: UIView!
    @IBOutlet weak var pinLineFocused: UIView!
    @IBOutlet weak var textField: UITextField!


    override func awakeFromNib() {
        super.awakeFromNib()
        self.selectionStyle = .none
        self.textField.isUserInteractionEnabled = false
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
        self.textField.isUserInteractionEnabled = selected
        if selected {
            self.textField.becomeFirstResponder()
        }
        self.pinLine.isHidden = selected
        self.pinLineFocused.isHidden = !selected
    }
}

Кто-нибудь знает, как решить эту проблему с отображением / скрытием клавиатуры и почему клавиатура пытается сначала спрятаться, а затем показать в очень короткое время?

0 ответов

Проблема в вашем коде заключается в том, что вы как бы отключаете взаимодействие textField, потому что у вас есть textField в ваших ячейках, и если вы нажмете на ячейку, вы будете взаимодействовать с textField, а не с самой ячейкой.

Таким образом, есть способ выбрать строку, даже если у вас есть textField в твоей камере.

Во-первых, вам нужно получить, когда вы нажали на это текстовое поле.

для этого вы можете использовать это....

let pointInTable = textField.convert(textField.bounds.origin, to: self.tableView)

Это даст вам значение в CGPoint([x, y]), например, [0,0, 0,0] или [0,0, 44,0]. В зависимости от высоты вашей ячейки.

Теперь есть функция, которая преобразует CGPoint в IndexPath.

let textFieldIndexPath = tableView.indexPathForRow(at: pointInTable)

Теперь это будет наш indexPath.

Теперь вы можете использовать cellSelected Fuction.

tableView.selectRow(at: textFieldIndexPath, animated: true, scrollPosition: .none)

Весь код будет таким:

let pointInTable = textField.convert(textField.bounds.origin, to: self.tableView)
let textFieldIndexPath = self.tableView.indexPathForRow(at: pointInTable)

tableView.selectRow(at: textFieldIndexPath, animated: true, scrollPosition: .none)

Вы можете вставить это textFieldDidBeginEditing Функция.

Другие вопросы по тегам