Перезагрузите UITable на лету при редактировании UITextField внутри одной из ячеек - PullRequest
6 голосов
/ 22 ноября 2011

У меня есть UITable, содержащий некоторые таможенные UITableCells.Эти ячейки содержат несколько UILabels и UITextField.Источником данных таблицы является свойство главного контроллера.(Этот контроллер также является делегатом и источником данных для таблицы.)

Вот упрощенный снимок экрана пользовательского интерфейса:

schreenshot

Теперь мне нужно обновить«на лету» содержимое всех UILabels, когда пользователь редактирует одно из полей UITextFields.Для этого я слушаю событие «Редактирование изменено» на уровне UITextField.Это вызывает следующее действие:

- (IBAction) editChangeHandler: (id) sender {
    MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [[delegate.viewController.myDataSourceArray objectAtIndex:self.rowIndex] setANumber: [theTextField.text intValue]];
    [delegate.viewController reloadRows];
}

Метод reloadRows в viewController выглядит следующим образом:

- (void) reloadRows {
    NSLog(@"called reloadRows");
    //perform some calculations on the data source objects here...
    [theUITable reloadData];
}

Моя проблема заключается в том, что всякий раз, когда пользователь изменяет значение в поле,Метод reloadRows успешно вызывается, как и reloadData, но он также вызывает отклонение клавиатуры.

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

Кто-нибудь знает решение этой проблемы или испытал ту же проблему?

Ответы [ 2 ]

3 голосов
/ 04 февраля 2012

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

Вот решение, которое я придумал:

  1. Временно сделать текстовое поле в другой ячейке таблицы первым респондентом.
  2. Вызовите reloadRowsAtIndexPaths, чтобы перезагрузить ячейку, которую редактировал ваш пользователь.
  3. Сделайте так, чтобы поле, которое редактировал пользователь, снова стало первым респондентом.

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

3 голосов
/ 22 ноября 2011

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

Посмотрите на:

- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation

Кроме того, вы можете редактировать эти ячейки напрямую, получив ячейку через:

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

если вы не хотите восстанавливать эти клетки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...