问题描述
I want to make my own pagination system
I have an issue looping thru non-constant elements.
我只想将初始列表中尚不存在的元素添加到分页数据列表中,并位于下一个分页步骤之下。
我收到循环非常量元素的错误,或者,如果我尝试获取索引,则 func: 句柄分页不符合视图
import SwiftUI
var dataModel1 :DataModel = .init()
var dataModel2 :DataModel = .init()
var dataModel3 :DataModel = .init()
var dataModel4 :DataModel = .init()
class DataModel: ObservableObject {
var id: String
var name: String
public init() {
self.name = "VOID"
self.id = UUID().description
}
}
class DataListOO : ObservableObject {
@Published var dataList = [DataModel]()
}
struct SwipeCellDemoView: View {
@Observedobject var data3 = DataListOO()
@Observedobject var paginatedData = DataListOO()
@State private var index: Int = 0
@State private var deleted: Bool = false
@State private var dragCompleted: Bool = false
@State private var numberElementsLoaded: Int = 6
@State private var maxElementVisibleIndex: Int = 0
@State private var numberOfPaginations : Int = 1
@State private var isLoading : Bool = false
@State private var shortList : Bool = true
@State private var loading : String = "NOT"
@State private var i : Int = 0
init(){
dataModel1.name = "1111"
dataModel2.name = "222"
dataModel3.name = "3333"
dataModel4.name = "44444"
data3.dataList.append(dataModel1)
data3.dataList.append(dataModel1)
data3.dataList.append(dataModel1)
data3.dataList.append(dataModel1)
data3.dataList.append(dataModel1)
data3.dataList.append(dataModel1)
data3.dataList.append(dataModel1)
data3.dataList.append(dataModel1)
data3.dataList.append(dataModel2)
data3.dataList.append(dataModel3)
data3.dataList.append(dataModel3)
data3.dataList.append(dataModel3)
data3.dataList.append(dataModel3)
data3.dataList.append(dataModel3)
data3.dataList.append(dataModel3)
data3.dataList.append(dataModel3)
data3.dataList.append(dataModel4)
data3.dataList.append(dataModel4)
data3.dataList.append(dataModel4)
data3.dataList.append(dataModel4)
data3.dataList.append(dataModel4)
data3.dataList.append(dataModel4)
data3.dataList.append(dataModel4)
data3.dataList.append(dataModel4)
data3.dataList.append(dataModel4)
for i in 0..<6 {
paginatedData.dataList.append(data3.dataList[i])
}
}
var body: some View {
Text(loading)
vstack(){
ScrollView(.vertical,showsIndicators: false){
ScrollViewReader { value in
Lazyvstack (alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/,spacing: 0){
ForEach(paginatedData.dataList.indices) { i in
HStack(spacing: 16) {
vstack(alignment: .leading) {
Text(verbatim: paginatedData.dataList[i].name)
}.onTapGesture {
}
}
.padding()
.frame(width:400,height: 160)
.onAppear(){
handlePagination(i)
}
}
}
}
}.disabled(isLoading)
Spacer()
}
}
//reset number pagination if research and if remove elements
private func handlePagination(_ index : Int){
if ( maxElementVisibleIndex < index ) {
maxElementVisibleIndex = index
}
/* this is where I have the issue looping thru non-constant elements
if (maxElementVisibleIndex == numberOfPaginations * Global.mainPaginationValue - 1)
{
ForEach(data3.dataList,id: \.id) { data in
i = data3.dataList.firstIndex(where: { $0.id == data.id })!
/*
if (i > numberElementsLoaded - 1 && i < numberElementsLoaded + Global.mainPaginationValue ){
paginatedData.dataList.append(data3.dataList[i])
}
*/
}
}
*/
numberOfPaginations = numberOfPaginations + 1
numberElementsLoaded = numberElementsLoaded + Global.mainPaginationValue
isLoading = true
loading = "LOADING"
dispatchQueue.main.asyncAfter(deadline: .Now()+3){
isLoading = false
loading = "NOT"
print(loading)
}
}
}
我得到循环通过非常量元素的错误,或者,如果我尝试获取索引,则函数:句柄分页不符合视图 问题出在上面,必须添加初始列表的正确元素
解决方法
这是基于 JArred 和 Jnpdx 帮助的答案: 对于非 View 相关的循环,对于非常量列表,使用:list.forEach{ element in
循环列表。完成后,就可以检索要添加的元素的索引(例如,对于分页,您不能使用值,只能使用位置)
与视图相关的循环:ForEach{ 索引不是强制性的,但在更改列表的情况下,必须添加它。因此,您再次检索列表元素的值而不是它的位置。
如果有人要在这个答案中添加一些元素,欢迎他。