Изменение высоты UITableViewCell из унаследованного класса UITableViewCell, когда UITextField получает фокус - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть унаследованный класс UITableViewCell, из которого я создаю пользовательскую ячейку, содержащую UITextField.

По умолчанию UITextField имеет высоту 25 пикселей.

Мне нужно поведение, когда пользователь щелкает текстовое поле, значение UITextField должно изменяться до 100 пикселей, и ячейка должна соответственно увеличиваться.

Я могу определить, когда UITextField получает фокус, благодаря уведомлениям и наблюдателям, но мне интересно, как программно сделать так, чтобы вызывался tableView: HeightForCellAtindexPath:.

Ответы [ 3 ]

2 голосов
/ 03 декабря 2010

Как говорит Endemic, tableView:heightForCellAtIndexPath: - это метод, который вам нужно реализовать. Согласно Apple, самый эффективный способ инициировать изменение размера - пустой блок beginUpdates / endUpdates, как этот.

[tableView beginUpdates];
[tableView endUpdates];

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

1 голос
/ 03 декабря 2010

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

@class CustomTableViewCell;

@protocol CustomTableViewCellDelegate 
- (void)customTableViewCellDidEnterTextMode:(CustomTableViewCell *)cell;
@end

@protocol (nonatomic, assign) id<CustomTableViewCellDelegate> delegate;

и просто вызовите метод делегата, в котором вы обнаруживаете, когда текстовое поле получает фокус

[self.delegate customTableViewCellDidEnterTextMode:self];

и в контроллере

- (void)customTableViewCellDidEnterTextMode:(CustomTableViewCell *)cell {
  self.editingIndexPath = [self.tableView indexPathForCell:cell];
  // from Jablair's answer
  [tableView beginUpdates];
  [tableView endUpdates];
}

А затем в tableView:heightForCellAtIndexPath: просто верните свой особый рост для self.editingIndexPath.

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

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

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

1 голос
/ 03 декабря 2010

Метод tableView:heightForCellAtIndexPath: вызывается всякий раз, когда табличное представление загружает данные, поэтому простой вызов reloadData (или одного из других, более избирательных методов перезагрузки) для табличного представления должен работать нормально.

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