SwiftUI 实战之List分页与无限滚动之高级版(2020教程)

在《SwiftUI 高级List分页与无限滚动之基础版(2020教程)》中我们介绍了List分页的基础实现方法,但是这种方法没有站在用户的角度思考,下面我们以用户为中心制作分页。

下面,我们将研究一下如何通过阈值控制获取下一页时间。

RandomAccessCollection+isThresholdItem

这次,我们将从extentions的RandomAccessCollection开始。这次,我们将实现一个名为isThresholdItem的函数,该函数确定给定item是否为阈值item。

extension RandomAccessCollection where Self.Element: Identifiable {
    func isThresholdItem(offset: Int,
                                             item: Item) -> Bool {
        guard !isEmpty else {
            return false
        }
        
        guard let itemIndex = firstIndex(where: { AnyHashable($0.id) == AnyHashable(item.id) }) else {
            return false
        }
        
        let distance = self.distance(from: itemIndex, to: endIndex)
        let offset = offset < count ? offset : count - 1
        return offset == (distance - 1)
    }
}

此函数查找给定项目的索引。如果找到,它将计算到终点索引的距离。指定的偏移量(即,结束之前的项目数)应等于distance —1。我们必须从该距离中减去1,因为结束索引等于count属性的值(即,集合中的当前项目数) )。我还为偏移量添加了一个简单的验证检查。偏移量应小于集合中的当前项目数.

界面部分

UI实现与第一种方法中的UI几乎相同。但是,有一个关键的区别,那就是listItemAppears函数

请记住,这里我们从第一种方法重用了isLastItem函数。仅当用户到达列表的末尾并且对下一页的请求仍在进行中时,才会显示加载视图

你可能感兴趣的:(SwiftUI 实战之List分页与无限滚动之高级版(2020教程))