2016-06-14 4 views
2

У меня есть UICollectionView, который отображает изображения из онлайн-базы данных. Сначала я загружаю 10 изображений, а затем, когда пользователь прокручивает нижнюю часть UICollectionView, я загружаю еще 10 изображений в фоновом режиме и обновляю представление. Выполнить это, используя следующий метод:UIRefreshControl в нижней части UICollectionView (загрузить больше данных)

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) { 
    if (self.localFeedContent != nil && self.localFeedContent!.count > 0) { 
     if indexPath.item == (self.localFeedContent!.count-1) { 
     loadMoreData() 
    } 
    } 

} 

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

ответ

10

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

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return array.count + 1 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    if indexPath.item == array.count{ 
     // return the new UICollectionViewCell with an activity indicator 
    } 
    // return your regular UICollectionViewCell 
} 

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) { 
    if indexPath.item == array.count{ 
     // loadMoreData() 
    } 
} 

Или вместо вызова loadMoreData() в willDisplayCell, вы могли бы назвать его в методе cellForItemAtIndexPath (когда вы возвращенная новый UICollectionViewCell с UIActivityIndicator). Либо можно работать.

+0

Я не уверен, почему вы используете indexPath.row в коллекцииView, возможно, вы имели в виду indexPath.item? – xaphod

+0

@xaphod оба работают, но я отредактирую свой ответ, чтобы использовать '.item', поскольку он, вероятно, более уместен для UICollectionView :) – Daven

1

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

override func scrollViewDidScroll(scrollView: UIScrollView) { 
     let threshold = 100.0 as CGFloat! 
     let contentOffset = scrollView.contentOffset.y 
     let maximumOffset = scrollView.contentSize.height - scrollView.frame.size.height; 
     if (maximumOffset - contentOffset <= threshold) && (maximumOffset - contentOffset != -5.0) {   //Add ten more rows and reload the table content. 

      runMoreAPI() 
     } 
    } 
+0

Дело в том, чтобы иметь индикатор того, что API загружает данные. –

+0

Я не могу видеть Управление обновлением внизу, реализуя этот метод @ kileros –

+0

Этот метод выполняет 'runMoreApi()', когда прокрутка достигает нижней части экрана. Идея такова: когда дойдете до низа, обновите – kileros