2017-01-12 4 views
0

Для ясности У меня есть UIView Controller с видом сверху, содержащим textfield. У меня также есть tableview ниже, что каждая строка содержит 1 textfield.Как перезагрузить все ячейки таблицы, редактируя текстовое поле в ячейке tableview - iOS Swift

Проблема: Когда я "didEndEditing" ЛЮБОЙ из текстовых полей означает, что это вид сверху и те, что указаны в таблице. Я хочу сохранить эту информацию в основных данных и перезагрузить tableview.

Это прекрасно работает, ЗА ИСКЛЮЧЕНИЕМ! Когда я выбираю текстовое поле (где угодно), введите значение, а затем из одного поля в текстовое поле выберите другое текстовое поле. Это заставляет клавиатуру застревать, которая никогда не исчезнет.

Я поставил диагноз, что это происходит потому, что, когда вызывается "DidEndEditing", я теряю ссылку на только что выбранное текстовое поле (whos-клавиатура вверх) из-за перезагрузки ячейки.

Неужели кто-нибудь сталкивался с этим раньше? Кто-нибудь нашел изящное решение для перезагрузки данных на tableview cell при выборе textfield внутри него?

Edit: Я попытался переместить reloadData() к "DidBeginEditing" функции в текстовом поле, и успешно получил индикатор выбора появиться, но опять же клавиатура не имеет никакого отношения, даже если я называю стать первым ответчиком после tableView.relaodData()

+0

Попробуйте перезагрузить данные, когда клавиатура вставлена ​​вместо загрузки в UItextField Delegate. Установите наблюдателя для открытия клавиатуры и закрытия. –

ответ

1

Я бы вообще не перезагрузил табличный вид, чтобы вы не нарушили статус первого ответчика вашего текста. Вы можете (1) вставить и удалить только то, что было изменено, или (2) обновить ячейки, которые нуждаются в обновлении.

1. Установка и удаление

Таким образом, вместо вызова myTableView.reloadData(), выяснить, какой индекс должен быть добавлены или удалены и вызвать соответствующие методы пути.

myTableView.insertRows(at: newIndexPaths, with: .automatic) 
myTableView.deleteRows(at: oldIndexPaths, with: .automatic) 

2. Косметический ремонт

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) 
    cell.data = dataArray[indexPath.row] 
    return cell 
} 

ли это:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) 
    decorate(cell, at: indexPath) 
    return cell 
} 

func decorate(_ cell: UITableViewCell, at indexPath: IndexPath) { 
    cell.data = dataArray[indexPath.row] 
} 

Таким образом, в дальнейшем вы можете ремонтировать, то есть обновить содержание и конфигурацию ячеек без перегрузки и нарушения состояния первого ответчика:

for cell in myTableView.visibleCells { 
    if let indexPath = myTableView.indexPath(for: cell) { 
     decorate(cell: cell, at: indexPath) 
    } 
} 
+0

. Проблема заключается в том, что текст заполнителя всех текстовых полей полагается на ВСЕ другие текстовые поля, поэтому relaodData() является CRUCIAL для функциональности. Я мог бы сделать так, чтобы все ячейки с пустыми текстовыми полями перезагружались, но это не помогло бы моей проблеме, так как пользователь мог бы выбрать один из них и столкнуться с такой же ошибкой. – Jerland2

+0

Это похоже на то, что ваш текст заполнителя основывается на данных в вашей модели данных, а не на самих представлениях. Представления не должны использоваться как источник истины, все это должно основываться на моделях. Не могли бы вы реорганизовать этот текст заполнителя по-разному? –

+0

Хм ... Вы правы, в настоящее время всякий раз, когда текстовое поле «didEndEditing» я сохраняю данные в моем файлеModel, затем перезагружайте tableview, чтобы обновить текст-заполнитель. Если есть другой способ обновить КАЖДЫЕ ячейки, заполнить текст без tableView.relaodData(), пожалуйста, поделитесь? – Jerland2

0

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

+0

У меня есть решение, использующее этот метод раньше, но оно на 80% правильное, потому что есть случай, когда я открываю представление -> Введите текст в текстовое поле topView, затем перейдите к выбору текстового поля в представлении таблицы, и это ошибка возникает. После того, как текстовое поле выбрано в представлении таблицы, решение отлично работает.Но этот первый случай края - это то, что все еще делает его ошибкой. – Jerland2

+0

Проблема с этим заключается в том, что мой editDidBegin не вызывается при выборе этого текстового поля в ячейке tableview – Jerland2

+0

- (void) tableView: (UITableView *) tableView willDisplayCell: (UITableViewCell *) cell forRowAtIndexPath: (NSIndexPath *) indexPath { if ([indexPath row] == ((NSIndexPath *) [[tableView indexPathsForVisibleRows] lastObject]). Строка) { // конец загрузки // например [activityIndicator stopAnimating]; }} добавьте это в свой код и убедитесь, что вы установили свой текстовый фильтр в качестве первого ответчика –

Смежные вопросы