我使用 Swift 进行 iOS 应用程序开发,遇到分页功能问题。
这个想法非常简单。输入查询时,搜索功能应返回所有可能的结果,如果结果超过 10,则使用分页器列出它们每页 10 行。用户可以通过单击分页器浏览到每个结果页面。但是,它应该始终返回/设置到第一个结果页面(当前分页符应等于0)当搜索框被用户清除或清空并准备好下一个输入时。
目前出现的问题是,使用分页器浏览上一个查询的结果页面后,当清除搜索框以进行新查询时,它永远不会返回到首页。结果,新的查询搜索结果从上一次浏览的页码的当前页码开始显示,导致第 1 页的结果被忽略,用户必须逐个使用分页器返回查看第一页的结果.
当前代码如下:
import SwiftUI
class DictionaryViewModel: ObservableObject {
@Published var filteredWordPairs: [WordPair] = []
@Published var searchText = "" {
didSet {
filterWordPairs()
}
}
private var allWordPairs: [WordPair] = DataLoader.loadCSVFile()
private var currentPage = 0
private let pageSize = 10
func wordPairsForPage(_ pageIndex: Int, pageSize: Int) -> ArraySlice<WordPair> {
let startIndex = pageIndex * pageSize
let endIndex = min(startIndex + pageSize, filteredWordPairs.count)
if startIndex >= endIndex {
return []
}
return filteredWordPairs[startIndex..<endIndex]
}
var canGoToNextPage: Bool {
return (currentPage + 1) * pageSize < filteredWordPairs.count
}
func gotoPreviousPage() {
currentPage = max(currentPage - 1, 0)
}
func gotoNextPage() {
if canGoToNextPage {
currentPage += 1
}
}
private func filterWordPairs() {
if searchText.isEmpty {
filteredWordPairs = []
} else {
let lowercaseSearchText = searchText.lowercased()
filteredWordPairs = allWordPairs.filter { wordPair in
let lowercasedWord1 = wordPair.Word1.lowercased()
let lowercasedWord2 = wordPair.Word2.lowercased()
return lowercasedWord1 .contains(lowercaseSearchText) ||
lowercasedWord2.contains(lowercaseSearchText) ||
lowercasedWord1.range(of: lowercaseSearchText) != nil ||
lowercasedWord2.range(of: lowercaseSearchText) != nil
}
}
currentPage = 0 // Reset currentPage when search text changes
}
}
当搜索文本更改时,您可以正确地将 currentPage 重置为 0,但当用户使用分页器浏览页面时,您不会更新 currentPage。我认为当 searchText.isEmpty 时您需要将 currentPage 重置为 0。这是更新的代码
@Published private var currentPage = 0
private func filterWordPairs() {
if searchText.isEmpty {
filteredWordPairs = []
currentPage = 0 // Reset currentPage when search text is cleared
} else {
let lowercaseSearchText = searchText.lowercased()
filteredWordPairs = allWordPairs.filter { wordPair in
let lowercasedWord1 = wordPair.Word1.lowercased()
let lowercasedWord2 = wordPair.Word2.lowercased()
return lowercasedWord1.contains(lowercaseSearchText) ||
lowercasedWord2.contains(lowercaseSearchText) ||
lowercasedWord1.range(of: lowercaseSearchText) != nil ||
lowercasedWord2.range(of: lowercaseSearchText) != nil
}
currentPage = 0 // Reset currentPage when search text changes
}
}