После того, как deleteRows использовался, сталFirstResponer () не дает фокус на textField - PullRequest
1 голос
/ 02 июля 2019

После того, как любая строка удалена с помощью deleteRows(at:with:) из моего табличного представления, я не могу получить текстовое поле в многократно используемой пользовательской ячейке, чтобы получить фокус на becomeFirstResponder() (который вызывается после вызова insertRows(at:with:)).becomeFirstResponder() всегда вызывается в cellForRow(at:).

Эта проблема всегда возникает после удаления строки из табличного представления с помощью deleteRows(at:with:).Перед удалением какой-либо строки проблем нет, becomeFirstResponder() может выделить фокус на текстовое поле, как и предполагалось.

Я провел несколько тестов, чтобы понять, почему эта проблема возникает после удаления строки ... Мои тесты показалиИнтересная разница:

Случай 1 : после удаления любой строки (т. е. пока becomeFirstResponder() возвращает false), textFieldShouldBeginEditing(_:) вызывается ДО cellForRow(at:) возвращается.textFieldDidBeginEditing(_:) никогда не вызывается.

Случай 2 : С другой стороны, перед удалением какой-либо строки (т. Е. Пока becomeFirstResponder() возвращает значение true), textFieldShouldBeginEditing(_:) называется ПОСЛЕ cellForRow(at:) возвращается.textFieldDidBeginEditing(_:) вызывается сразу после textFieldShouldBeginEditing(_:), как и ожидалось.

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

В связанных вопросах и ответах предлагается не перезагружать tableView из textFieldDidEndEditing().В моем случае метод deleteRows(at:with:) иногда вызывается изнутри textFieldDidEndEditing(), а иногда вызывается из tableView(_:commit:forRowAt:) (т. Е. Смахиванием влево).Так что это не объясняет мою проблему.Другой связанный Q & A может быть этот .

getFocus () в классе CustomCell, вызывается из cellForRow(at:) в TableViewController:

func getFocus() {
    if let itemTextField = itemTextField {
        itemTextField.delegate = self
        itemTextField.isUserInteractionEnabled = true
        itemTextField.becomeFirstResponder()
    }
}

cellForRow(at:):

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let item = items[indexPath.row]
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
    cell.setCell(item: item)
    cell.delegate = self

    if insertingRow == true {
        if isTempItem(item: item, indexPath: indexPath) {
                cell.getFocus()
        } else {
            print("isTempItem returned false, no need to give focus.")
        }
    }

    return cell     
}

1 Ответ

0 голосов
/ 02 июля 2019

Не вызывайте getFocus в cellForRowAt, Гарантируется, когда вы вставляете новую строку, Вы можете перейти к новой строке и вызвать getFocus в willDisplayCell.

Надеюсь вам помочь.

...