2015-11-13 2 views
0

Настройка: таблица имеет 1 пользовательскую ячейку. Эта ячейка имеет 1 текстовое поле. В каждом текстовом поле вводится номер. ТаблицаView имеет 5 строк (этой ячейки). Если я изменю одно число в любой из ячеек, то все ячейки нужно обновить, я просто звоню tableView.reloadData(). Изменение текстового поля обрабатывается событием editingDidEnd.Как обновить UITableView, чтобы UITextField в ячейке не потерял фокус.

Проблема: Я нажимаю любой из текстовых полей и меняю номер. Затем я нажимаю другой textField, чтобы изменить его значение. сначала вызывается editingDidEnd, все значения пересчитываются и вызывается tableView.reloadData. Теперь щелчок на втором текстовом поле пропускается, потому что таблица перезагружается.

Я не могу обновить ячейки напрямую, потому что они являются настраиваемыми ячейками, и значение изменяется внутри этого класса. Я не могу обновить ВСЕ ячейки из пользовательского класса ячеек.

Трудный вопрос для объяснения в письменной форме специально для неродного английского говорящего. Если вы поймете вопрос, любые указатели будут оценены :).

Использование Xcode 7.1 и Swift. Спасибо.

ответ

0

Когда вы вызываете reloadData, все ячейки удаляются из таблицы и снова добавляются. Поскольку он удален, он больше не находится в responder chain, что означает, что его текстовое поле не может быть первымResponder (выбранным).


Существует два варианта, которые могли бы работать.

Следите за выбранной строкой, звоните reloadData, затем звоните becomeFirstResponder в текстовое поле для правильной строки.

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

+0

Если эти два варианта у меня есть, то я пойду с первым. Второй вариант не является жизнеспособным, так как ячейки - это все таможенные ячейки, и они не знают о значении состояния друг друга и т. Д. Для первого варианта я не знаю, действительно ли ячейка когда-либо получает 'didSelectRowAtIndexPath'. Позвольте мне попытаться вернуться к вам. Спасибо за предложения. – oyalhi

+0

Я могу вызвать reloadData в событии editDidBegin. Тогда это не пропущено. Хотелось бы, чтобы был лучший способ справиться с этим. Все, что я делаю, - это просто щелчок с одного текстового поля на другой. – oyalhi

+0

Второй вариант оказался намного проще реализовать. – oyalhi

0

Это может быть довольно просто, в идеале вы можете сохранить значения для поля, которое вы хотите сфокусировать, и путь указателя к соответствующей ячейке (например, когда вы обновляете поле редактирования после перезагрузки?).

Этот код должен помочь:

- (void)tableView:(UITableView *)tableView 
    willDisplayCell:(UITableViewCell *)cell 
forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexPath == self.editingIndexPath) 
    { 
     [self.editingTextField becomeFirstResponder]; 
    } 
} 
Смежные вопросы