12

当用户滚动到UICollectionView.

我可以通过添加页脚UIButton来做到这一点。UICollectoinView当用户滚动到页脚并触摸按钮时,会正确添加新单元格。UIButton可以再次触摸页脚以添加更多页面。

我尝试将其自动化,因此当用户滚动到底部时,会自动调用添加新单元格的正确方法:

- (UICollectionReuseableView *)collectionView: (UICollectionView *)collectionView viewForSupplementaryElementOfKind: (NSString *)kind atIndexPath: (NSIndexPath *) indexPath
{

    // code for headerView
    // ...

    // code for footerView
    MySupplementalFooter *footerView = nil;
    if ( [kind isEqual:UICollectionElementKindSectionFooter] )
    {
        footerView = [self.collectionView dequeueReuseableSupplemntaryViewOfKind:kind withReuseIdentifier:@"FooterId" forIndexPath:indexPath];
        if (LoadMoreIsEnabled) 
        {
            footerView.loadMoreFooterButton.setHidden:NO];
            [self loadMoreFooterButtonAction]; // calls the method to add cells to the dictionary for cv 
        } else 
        {
             footerView.loadMoreFooterButton setHidden:YES];
        }

        return footerView;
    }
}

loadMoreFooterButtonAction方法被调用,但整个UICollectionView空白。刷新UICollectionView不会把它带回来。

4

6 回答 6

20

在IOS8中有一个UICollectionViewDelegate方法willDisplayCell

func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
    if indexPath.item == (data.count-1) {
        loadData()
    }
}
于 2015-06-24T20:20:15.713 回答
15

在表格视图中,您应该在 willDisplayCell() 方法中加载更多数据。对于集合,没有这样的对应物。但是,你可以这样做。希望能帮助到你。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    // Other code here ...

    if (indexPath.item == [self.photos count] - 1) {
        [self loadPhotos];
    }

    return cell;
}

- (void)loadPhotos {
    [self showLoadingIndicator];
    self.operation = [client HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
        [self hideLoadingIndicator];

        // Get data
        NSArray *photosData = responseObject[@"data"];
        NSInteger numberOfResults = [photosData count];
        NSInteger totalCount = [self.photos count];

        if (numberOfResults > 0) {
            NSMutableArray *indexPaths = [NSMutableArray new];

            for (NSInteger i = 0; i < numberOfResults; i++) {
                Photo *photo = [Photo new];
                photo._id = [photoData[@"id"] integerValue];
                photo.url = photoData[@"url"];

                [self.photos addObject:photo];
                [indexPaths addObject:[NSIndexPath indexPathForRow:totalCount + i
                                                     inSection:0]];
            }

            [self.collectionView performBatchUpdates:^{
                [self.collectionView insertItemsAtIndexPaths:indexPaths];
            } completion:nil];
        }        
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        [self hideLoadingIndicator];
        // Handle error here
    }];

   [self.operation start];
}
于 2014-02-16T14:52:27.447 回答
4

我知道这是一个老问题,但我会为未来的答案寻求者提供解决方案。通常当我在 UITableView 上进行无限滚动时,我会检查 tableView 的滚动视图的边界是否与 tableFooterView 的矩形相交。在 UICollectionViews 中获取页脚视图有点复杂,所以我在 collectionView 的末尾创建一个矩形,看看它是否与 scrollView 边界相交,如果是,我会加载更多项目。我还检查了表格中是否至少有一些东西,所以我不会在表格实例化时尝试加载更多内容。

注意:more在这种情况下,您的方法将更新您的 collectionView 数据源,并附加新项目。您的 numberOfItems/sections 方法应该反映新的计数。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (CGRectIntersectsRect(scrollView.bounds, CGRectMake(0, self.collectionView.contentSize.height, CGRectGetWidth(self.view.frame), 40)) && self.collectionView.contentSize.height > 0)
    {
        [self more];
    }
}
于 2013-12-04T19:37:14.517 回答
0

您也可以使用collectionView(_:prefetchItemsAt:) 教程12

于 2017-11-29T10:03:21.307 回答
-1

我假设您正在尝试从桌面网页执行“无限滚动”之类的操作,当用户到达页面底部时,您会加载更多内容。在 iOS 上,这不是一个非常常用的设计。通常,开发人员将使用绝对条目总数初始化他们的 UITableView 或 UICollectionView。如果他们需要通过网络传输数据,他们会根据需要异步加载数据(当单元格或视图出现在屏幕上时),并且在内容加载之前,它们会显示某种临时内容,例如带有微调器的空白视图。

也就是说,如果您想以更像桌面 Web 应用程序的方式进行无限滚动,您应该实现 UIScrollViewDelegate 协议(或 UICollectionViewDelegate,它是一个超集)并监听scrollViewDidScroll:回调。在该回调中,遍历 UICollectionView 的indexPathsForVisibleItems并检查是否有任何索引路径映射到集合中的“最后一个”项目,这表明用户已滚动到最后。那时,调用你的逻辑来加载更多的东西。

于 2013-06-19T01:11:19.380 回答
-1

我在将@sukhrob 的答案转换为我的项目的 swift 时遇到了困难,所以这里是他在 Swift 3 中的代码,以便于复制和粘贴。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        // Other code here ...
        if indexPath.item == photos.count() - 1 {
            loadPhotos()
        }
        return cell
    }

    func loadPhotos() {
        showLoadingIndicator()
        operation = client.httpRequestOperation(with: request, success: {(_ operation: AFHTTPRequestOperation, _ responseObject: Any) -> Void in
            self.hideLoadingIndicator()
                // Get data
            let photosData: [Any] = responseObject["data"]
            let numberOfResults: Int = photosData.count
            let totalCount: Int = photos.count()
            if numberOfResults > 0 {
                var indexPaths = [Any]()
                var i = 0
                while i < numberOfResults {
                    let photo = Photo()
                    photo.id = CInt(photoData["id"])
                    photo.url = photoData["url"]
                    photos.append(photo)
                    indexPaths.append(IndexPath(row: totalCount + i, section: 0))
                    i
                }
                i += 1

        collectionView?.performBatchUpdates({() -> Void in
                    collectionView?.insertItems(at: indexPaths as? [IndexPath] ?? [IndexPath]())
                }) { _ in }
            }
        }, failure: {(_ operation: AFHTTPRequestOperation, _ error: Error?) -> Void in
            self.hideLoadingIndicator()
            // Handle error here
        })
        operation.start()
于 2017-08-16T17:40:27.020 回答