2013-02-18 4 views

ответ

28

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

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

- (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. Добавьте изображения в подвью, чтобы они отображались как прогресс, пока не будет выполнен предыдущий код. Это помогает.

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

4

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

+0

Пожалуйста заявить о своей связи с эта структура (если таковая имеется) на момент, когда это читается, как будто это может быть спам. – ChrisF

+1

Ни при каких обстоятельствах! Просто огромный поклонник! – Matt

+0

Я понял, что это - но другие могут и нет. – ChrisF

10

Вы можете использовать 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 
    } 

} 

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

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

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

+0

Кто-нибудь это пробовал? это работает? – Ricardo

+1

Я использую это в своем приложении iOS 7 и, похоже, работает. Я фактически устанавливаю свой 'tableFooterView' в представление' UIRefreshControl' – hunteros

+1

извините, 'UIActivityIndicatorView' не' UIRefreshControl'! – hunteros

8

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

+0

Имеет ReactiveCocoa зависимость, поэтому он бесполезен. –

+1

Работал отлично для меня. Все подходы, использующие методы UIScrollViewDelegate, - это боль в заднице в отношении производительности. Этот метод использует элемент UIRefreshControl по умолчанию, который намного лучше, чем любой другой подход, с которым я столкнулся. – marcelosalloum

+0

Но у меня проблема. Я не могу удалить UIRefreshcontroller после загрузки данных. [refreshController endRefreshing] ничего не делает. –

2

Для 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 
    } 
} 

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

+0

, пожалуйста, объясните вкратце @Prcela –

2

Следующий ответ приведен в 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() 
     } 
} 
+0

Это самый правильный ответ на этот год. Я использую CCBottomRefreshControl, пока мне не пришлось выполнить мой проект до версии 3.0, и он повредился повсюду. Это гораздо лучшее решение. Спасибо! –

+0

Человек, ты спас мой день. Это лучшее решение для быстрого 3 –

Смежные вопросы