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
Функция.