清除搜索框后分页不会设置回首页

问题描述 投票:0回答:1

我使用 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
    
}

}
ios swift search pagination paginator
1个回答
0
投票

当搜索文本更改时,您可以正确地将 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
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.