Есть ли способ инициировать событие, например, с помощью IBAction
, когда пользователь прокручивается в конец UITableView
? Если это произойдет, я хотел бы добавить несколько строк. Как это сделать?
Добавьте строки в UITableView при прокрутке вниз
Ответ 1
Просто прослушайте метод делегата scrollViewDidScroll:
, сравните смещение содержимого с текущим возможным смещением, и если ниже, то некоторый порог вызовет ваш метод для обновления таблицы. Не забудьте вызвать [tableView reloadData]
, чтобы перезагрузить недавно добавленные данные.
РЕДАКТИРОВАТЬ: Составьте абстрактный код, не уверен, что он работает, но должен.
- (void)scrollViewDidScroll: (UIScrollView *)scroll {
// UITableView only moves in one direction, y axis
CGFloat currentOffset = scroll.contentOffset.y;
CGFloat maximumOffset = scroll.contentSize.height - scroll.frame.size.height;
// Change 10.0 to adjust the distance from bottom
if (maximumOffset - currentOffset <= 10.0) {
[self methodThatAddsDataAndReloadsTableView];
}
}
Ответ 2
Если это немного поздно, но я думаю, что нашел лучшее решение:
вместо
- (void)scrollViewDidScroll: (UIScrollView)scroll
Я использовал
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
Это намного удобнее, потому что событие запускается только один раз. Я использовал этот код в своем приложении для загрузки большего количества строк в моем табличном представлении внизу (возможно, вы узнаете этот тип перезагрузки из приложения facebook - только разница, которую они обновляют вверху).
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
if (maximumOffset - currentOffset <= -40) {
NSLog(@"reload");
}
}
Надеюсь, кто-нибудь поможет в этом.
Ответ 3
Я использую этот фрагмент. в tableView:willDisplayCell:forRowAtIndexPath:
Я проверяю, будет ли ячейка с последним маршрутом индекса заглажена.
Для таблицыView с одним разделом:
[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]
с большим количеством разделов:
[indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:[self numberOfSectionsInTableView:self.tableView]-1]
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if(!_noMoreDataAvailable)
{
if ([indexPath isEqual:[NSIndexPath indexPathForRow:[self tableView:self.tableView numberOfRowsInSection:0]-1 inSection:0]])
{
[self.dataSourceController fetchNewData];
}
}
}
после извлечения dataSourceController будет информировать делегата tableView, и это перезагрузит данные.
Ответ 4
NSInteger currentOffset = scrollView.contentOffset.y;
NSInteger maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height;
// Hit Bottom?
if ((currentOffset > 0) && (maximumOffset - currentOffset) <= 10) {
// Hit Bottom !!
}
Ответ 5
Это может быть достигнуто гораздо более простым способом, я думаю, вам просто нужно определить направление прокрутки, так как в этом случае он будет прокручиваться вниз.
Сначала в файле .h объявите переменную:
CGPoint pointNow;
В файле .m в методе scrollViewDidScroll нам нужно реализовать этот код: -
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y > pointNow.y) {
//Enter code here
}
}
Ответ 6
Swift
Вот версия Swift @user944351 answer:
func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
let currentOffset = scrollView.contentOffset.y
let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height
if maximumOffset - currentOffset <= -40 {
print("reload")
}
}
Просто добавьте этот метод в свой класс делегатов UITableView
. Я нашел -40
слишком большим, но вы можете настроить его в соответствии с вашими потребностями.
Подробнее
- См. мой более полный ответ, в котором приведен пример метода перезагрузки данных с использованием ограничений и смещений для базы данных.
Ответ 7
Я не уверен, почему вы хотите это сделать, но я думаю, вы могли бы добавить код к вашему методу cellForRowAtIndexPath
, чтобы, если indexPath.row == последняя строка, вызовите метод для добавления большего количества строк...