UITableView reloadData автоматически вызывает resignFirstResponder - PullRequest
42 голосов
/ 20 июня 2011

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

Чтобы сделать вещи более понятными и простыми в обслуживании, я сделал делегаты и источники данных отдельными классами и использую уведомления для их создания.взаимодействовать с tableView.Таким образом, после того, как значение было выбрано из UIPickerView, источник данных tableView получает уведомление и, в свою очередь, уведомляет основной ViewController, который содержит ссылку на tableView.Оттуда я звоню

[_tableView reloadData];

, и все, кажется, работает, за исключением того, что UIPickerView исчезает, я думаю, потому что ячейки регенерируются и где-то вызывается некоторый resignFirstResponder, или что-то в этом роде.Есть ли другой способ заставить tableView обновлять свои значения без необходимости реализовывать собственный метод где-нибудь, который это делает, что было бы довольно уродливо?

Ответы [ 13 ]

0 голосов
/ 06 января 2015

Как уже упоминалось @Eiko, это работает для меня!

Обновление ячейки в методе pickerView:didSelectRow:inComponent: UIPickerViewDelegate:

- (void) pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
  TableViewCell *cell = (TableViewCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:pickerView.tag inSection:0]];

  /*
  Update your cell here. 
  */

  // Reload TableViewCell will resign the PickerView, so we need to focus it back.  
  [self.tableView reloadData];
  NSIndexPath* indexPath = [self.tableView indexPathForCell:cell];
  NSArray* indexArray = [NSArray arrayWithObjects:indexPath, nil];
  [self.tableView reloadRowsAtIndexPaths:indexArray withRowAnimation:UITableViewRowAnimationNone];
  [cell.textField becomeFirstResponder];
}
0 голосов
/ 15 апреля 2013

Вы можете решить эту проблему, временно передав статус первого респондента другому объекту.Обычно вы передаете управление представлением ввода вашему ViewController.Поскольку ваш UIViewController также наследуется от UIResponder, вы можете сделать что-то вроде этого:

на didSelect {....

[yourViewController intoFirstRespoder];

[_ tableView reloadData];

[yourInputField intoFirstResponder];

....}

Таким образом, после перезагрузки таблицы вы можете перенести статус firstResponder обратно на метку / поле.По умолчанию canBecomeFirstResponder имеет значение NO.Поэтому вам может потребоваться переопределить то же самое в вашем ViewController.Кроме того, вам может понадобиться сделать inputView для вашего контроллера представления таким же, как ваш UIPicker, иначе он может просто отклонить ваш инструмент выбора и отобразить клавиатуру.

0 голосов
/ 17 ноября 2012

Если вы столкнулись с этой проблемой с помощью панели поиска, в iOS 6 это было сделано для меня:

  • Создайте UISearchBar и добавьте его как подпредставление к вашемуUITableView вверху.
  • Создайте фиктивную первую ячейку в вашем UITableView, чтобы панель поиска блокировала только эту фиктивную ячейку, а не вашу фактическую ячейку с данными.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...