Подтвердить что ты не робот

UIRefreshControl в нижней части UITableView iOS6?

Можно ли добавить UIRefreshControl в нижней части UITableView? Я бы использовал его для загрузки большего количества данных. Пожалуйста, предложите?

4b9b3361

Ответ 1

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

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

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
    if (endScrolling >= scrollView.contentSize.height)
    {
        NSLog(@"Scroll End Called");
        [self fetchMoreEntries];
    }
}

Или вы можете сделать что-то подобное:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
    {
        if (!self.isMoreData)
        {
            self.MoreData = YES;

            // call some method that handles more rows
        }
    }
}

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

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

Ответ 2

Вы можете использовать UIView для настройки вашего refreshControl внизу. Создайте UIView и добавьте его в UITableView как footerView.

UIView* footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];

[footerView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"refreshImage.png"]]];

tableView.tableFooterView = footerView;

Скрыть: tableView.tableFooterView.hidden = YES;

Внедрить делегат UIScrollView -

(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if ((scrollView.contentOffset.y + scrollView.frame.size.height) >= scrollView.contentSize.height)
    {
             tableView.tableFooterView.hidden = NO;
            // call method to add data to tableView
    }

}

перед добавлением данных в таблицуView сохранить текущее смещение на CGPoint offset = tableView.contentOffset;

вызвать reloadData, затем установить ранее сохраненное смещение обратно в tableView [tableView setContentOffset:offset animated:NO];

Чтобы вы могли почувствовать новые данные, добавленные снизу.

Ответ 3

Я недавно застал ту же проблему и напишу категорию для класса UIScrollView. Здесь CCBottomRefreshControl.

Ответ 4

На самом деле свободная среда Sensible TableView действительно предоставляет эту функциональность из коробки. Вы указываете номер партии и автоматически загружаете данные, отображая последнюю ячейку как ячейку "загрузить больше". Когда вы нажмете эту ячейку, она автоматически загрузит следующую партию и так далее. Стоит взглянуть на.

Ответ 5

Следующий ответ приведен в Xcode 8 и Swift 3.

сначала объявить

var spinner = UIActivityIndicatorView()

чем в viewDidLoad, напишите следующий код:

spinner = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
spinner.stopAnimating()
spinner.hidesWhenStopped = true
spinner.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 60)
tableView.tableFooterView = spinner

теперь наконец override метод делегата scrollViewDidEndDragging со следующим:

override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        let offset = scrollView.contentOffset
        let bounds = scrollView.bounds
        let size = scrollView.contentSize
        let inset = scrollView.contentInset

        let y = offset.y + bounds.size.height - inset.bottom
        let h = size.height

        let reloadDistance = CGFloat(30.0)
        if y > h + reloadDistance {
            print("fetch more data")
            spinner.startAnimating()
        }
}

Ответ 6

Для UITableView я предлагаю следующий подход:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{    
    // if this is the last row that we have in local data
    // and we didn't reach the total count of rows from the server side
    if (count == indexPath.row+1 && count < total)
    {
        // .. fetch more rows and reload table when data comes
    }
}

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

Ответ 7

Используйте CCBottomRefreshControl в cocoapods,

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

Надеюсь, поможет.

Ответ 8

Эта библиотека Swift добавляет тягу, чтобы обновить до нижней части UITableview.

https://github.com/marwendoukh/PullUpToRefresh-iOS

Я надеюсь, что это поможет вам.