【问题标题】:Load more data when NSCollectionView is scrolled to end of content (macOS)当 NSCollectionView 滚动到内容末尾时加载更多数据 (macOS)
【发布时间】:2018-06-13 12:14:08
【问题描述】:

在我的 macOS 应用程序中,我有一个 NSCollectionView。我下载了数据并将其放在集合视图中,现在我想在用户滚动到可用内容的底部时加载更多数据。在 iOS 上,我可以使用 UIScrollViewDelegate.scrollViewDidEndDragging(_:willDecelerate:) 执行类似的操作,但我不确定如何在 macOS 上执行此操作。

当用户滚动到视图底部时如何触发加载?

【问题讨论】:

    标签: swift macos scroll nsscrollview nscollectionview


    【解决方案1】:

    我在 iOS 上使用的一种可能方法是在显示特定项目时触发加载。在 macOS 上,这可以使用 NSCollectionViewDelegatecollectionView(_:willDisplay:forRepresentedObjectAt) 方法来完成。像这样的:

    func collectionView(_ collectionView: NSCollectionView, willDisplay item: NSCollectionViewItem, forRepresentedObjectAt indexPath: IndexPath) {
        if indexPath == self.lastIndexPath {
            loadNextSection()
        }
    }
    
    func loadNextSection() {
        guard let self.loading == false else {
            return
        }
        self.loading = true
        self.loader.loadSection(nextSection) { objects in
            self.nextSection += 1
            self.sections.append(objects)
            self.lastIndexPath = IndexPath(indexes: [self.sections.count, objects.count])
            DispatchQueue.main.async {
                self.collectionView.reloadData()
            }
        }
    }
    

    【讨论】:

    • 您使用了正确的 NSCollectionView 对象名称,但您在回答中提到了“iOS”。你的答案是 macOS 还是 iOS?
    • 对不起,我提到 iOS 是因为我没有在 macOS 上使用过这个特定的 API,但它类似于我使用过的 UICollectionView/UITableView 解决方案。由于@Blantrek 带来了 iOS 的经验,我还想在他可能使用过的东西和 macOS 上可用的东西之间建立联系。这里提到的所有 API 都可以在 macOS 上使用。我已经编辑了我的答案以使其更清楚。
    • @Jumhyn 你的警卫让 self.loading == false else { return } 不是一个好的模式
    • @Jumhyn willDisplay 加载比我想要的更多的单元格,因此它的应用程序下载比我想要的更早并且更多。我看到一个 mac 应用程序,我滚动到底部而不是加载更多数据。那么collectionview滚动有某种委托吗?
    【解决方案2】:

    看起来,我解决了。创建一个观察。并连接 nscollectionview 的滚动视图并在我滚动时使用它..:

    if (self.scrollViewColl.verticalScroller?.floatValue.isEqual(to: 1.0))! && loading == false
    

    【讨论】:

      【解决方案3】:

      您也可以检查indexPath.item 是否等于data source array count,如果是,则调用在数据源数组中加载数据的方法。

      func collectionView(_ collectionView: NSCollectionView, willDisplay item: NSCollectionViewItem, forRepresentedObjectAt indexPath: IndexPath) {
          if indexPath.item == self.data_source_array.count-1 {
             self.method_to_load_more_data()
          }
      }
      

      添加更多数据后不要忘记reloadData() 集合视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-08
        相关资源
        最近更新 更多