У меня есть UITableView
с ячейками, которые имеют возможность перестановки UIContextualActions
для удаления или переименования (редактирования) текстовых полей отдельной ячейки.
Поскольку я переключился на Swift 5 / iOS 13
, вызывая переименование UIContextualAction
в этих ячейках клавиатура запускается и мгновенно закрывается, прежде чем пользователь сможет набрать текст. Мало того, что клавиатура исчезает, конкретная ячейка, которую я пытаюсь редактировать, становится полностью пустой, и генерируется следующее предупреждение:
[Snapshotting] Snapshotting a view (0x10c90a470, _UIReplicantView) that has not been rendered at least once requires afterScreenUpdates:YES.
Ниже приведен код для переименования UIContextualAction
:
let actionRename = UIContextualAction(style: .normal, title: "") { (action, view, completionHandler) in
let cell = self.tableLayers.cellForRow(at: indexPath) as! LayerUITableViewCell
cell.layerTitle.isEnabled = true // enable UITextField editing
cell.layerTitle.becomeFirstResponder() // launch keyboard
cell.layerTitle.selectedTextRange = cell.layerTitle.textRange(from: (cell.layerTitle.beginningOfDocument), to: (cell.layerTitle.endOfDocument)) // select all text
completionHandler(true)
} // end of let actionRename
Я предполагаю, что анимация действия UIContextual каким-то образом вызывает resignFirstResponder
клавиатуры.
Подводя итог, до swift 5/iOS 13
порядок событий был примерно таким:
- пользователь пролистывает ячейку влево / вправо
- пользователь нажимает кнопку UIContextual
- ячейка возвращается в центр
- текст выделяется
- клавиатура запускает
- типы пользователей, нажатия возвращаются
- клавиатура
resignFirstResponder
В то время как поведение, которое я наблюдаю после миграции, выглядит следующим образом:
- пользователь перемещает ячейку влево / вправо
- пользователь нажимает кнопку UIContextual
- текст выделен
- клавиатура запускается
- ячейка возвращается в центр (что как-то вызывает
resignFirstResponder
) - клавиатура
resignFirstResponder
Обновление 2019/10/02
Я подтвердил, что именно анимация ячейки вызывает преждевременное отключение клавиатуры. Если я введу задержку после завершения, то Хандлер выглядит следующим образом:
let actionRename = UIContextualAction(style: .normal, title: "") { (action, view, completionHandler) in
completionHandler(true)
self.perform(#selector(self.layerRenameDos), with: nil, afterDelay: 1.0)
// layerRenameDos has the editing/firstResponder code from above
} // end of let actionRename
С этим изменением ячейка анимируется обратно в центр, запускается клавиатура, и я могу печатать. Это, однако, очевидно, хакерский обходной путь. Любые предложения будут оценены