Реализация Pull-to-refresh сдвигает ячейки в UITableViewController вниз.

Я столкнулся с проблемой размещения UITableViewController и одновременного обновления.

Я реализовал pull для обновления, и при реализации pull для обновления выполняется вызов API на сервер, а данные извлекаются и отображаются в списке представлений таблицы. Проблема в том, что при обновлении таблица перемещается вниз от своего фактического положения. Ниже мой код и скриншот.

viewDidLoad{

 refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(handleRefresh:) forControlEvents:UIControlEventValueChanged];
    [self.tableView addSubview:refreshControl];

}

- (void)handleRefresh:(id)sender
{
    // do your refresh here...
    [self Data];//method to get data from server
    [refreshControl endRefreshing];

}

введите здесь описание изображения

Любая помощь очень ценится.


person Daljeet    schedule 03.06.2015    source источник


Ответы (1)


UITableViewController имеет встроенный элемент управления обновлением. Вы не хотите добавлять новый в качестве подпредставления к табличному представлению. Просто инициализируйте self.refreshControl.

viewDidLoad {
  self.refreshControl = [[UIRefreshControl alloc] init];
  [self.refreshControl setTintColor:[UIColor lightGrayColor]];
  [self.refreshControl addTarget:self action:@selector(didRefresh:) forControlEvents:UIControlEventValueChanged];
}

- (void)didRefresh:(UIRefreshControl *)sender {
  [sender endRefreshing];
  [self Data];
}
person Max    schedule 03.06.2015
comment
спасибо, я применил ваш код, но теперь, когда я открываю, в таблице нет индикатора. Метод didRefresh не вызывается при вытягивании вниз. - person Daljeet; 04.06.2015
comment
Убедитесь, что вы не переопределяете refreshControl в своем подклассе. self.refreshControl реализован в UITableViewController, поэтому вам не нужно объявлять его в своем классе. - person Max; 04.06.2015
comment
Этот работающий, но метод didRefresh вызывается два раза при вытягивании вниз, что не решает мою проблему. - person Daljeet; 05.06.2015
comment
Убедитесь, что ничто другое не вызывает метод обновления и что вы включили [sender endRefreshing]. Поставьте точку останова в didRefresh и проверьте отправителя. Опубликуйте код, если у вас все еще есть проблемы. - person Max; 05.06.2015
comment
Я проверил, что мой код работает с этим методом: - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height; if (endScrolling ›= scrollView.contentSize.height) { NSLog(@Scroll End Called); нижнее обновление = ДА; [собственные данные]; } } где [собственные данные]; снова позвонил. - person Daljeet; 06.06.2015
comment
Если вы вызовете [self Data] в scrollViewDidEndDecelerating, он будет вызван, когда scrollView перестанет прокручиваться И в didRefresh. Когда вы потянете вниз, чтобы обновить, а затем отпустите, и tableView подпрыгнет вверх, это вызовет завершение замедления. Просто уберите [self Data] из метода делегата представления прокрутки. - person Max; 06.06.2015
comment
Я использую этот метод делегата прокрутки, потому что в представлении таблицы также есть нижнее обновление. Итак, я не могу удалить из него [self Data]. - person Daljeet; 06.06.2015
comment
Это неправильный метод для использования, потому что он будет вызываться каждый раз, когда табличное представление перестанет прокручиваться, независимо от того, находится оно внизу или нет. Также кажется, что вы хотели бы вызвать другой метод, который получает следующую страницу данных и добавляет ее в ваш источник данных, а не заменяет все. Если вам нужен быстрый способ реализовать нижнее обновление (бесконечную прокрутку), я предлагаю вам проверить эту библиотеку github.com/samvermette/ SVPullToRefresh - person Max; 07.06.2015