微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

显示搜索结果的问题

如何解决显示搜索结果的问题

本质上,我有一个带有 JSON 数据的 tableview 和一个搜索控制器,供用户快速从响应中找到值。虽然在尝试搜索时最初加载 tableview 数据,但我收到错误 index out of range错误发生在 cellForRowAt 函数内部。以下是我目前正在做的:

var sections = [customerListSection]()
var structure = [customerList]()

var searchsections = [customerListSection]()
var searchstruct = [customerList]()



override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    let section = sections[section]
    let searchsection = searchsections[section]
    
    if isFiltering() {
        return searchsection.count
    }
    return section.count

}

override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)
    
    let item = sections[indexPath.section].items[indexPath.row]

    let customerList: customerList
    if isFiltering() {
        customerList = searchstruct[indexPath.row]
    } else {
        customerList = item
    }
  return cell
}


struct customerListSection {
    let customerType : String
    var items : [customerList]
}

struct customerList: Decodable {
    let customerid: Int
    let customer: String
    let type: String
}

解决方法

从您的代码来看,似乎有多个部分,因此您需要实现numberOfSections(in:)方法。

如果你不实现这个方法,表格会用一个section来配置表格。)

https://developer.apple.com/documentation/uikit/uitableviewdatasource/1614860-numberofsections

由于行数是项目数,而不是节数,tableView(_:numberOfRowsInSection:) 方法应该返回 items.count

以下是修改后的代码:


override func numberOfSections(in tableView: UITableView) -> Int {
    if isFiltering() {
        return searchsections.count
    }
    return sections.count
}

override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
    if isFiltering() {
        return searchsections[section].items.count
    }
        return sections[section].items.count
    }

override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {


    let cell = tableView.dequeueReusableCell(withIdentifier: "cell",for: indexPath)

    let customerList: customerList
    if isFiltering() {
        customerList = searchsections[indexPath.section].items[indexPath.row]
    } else {
        customerList = sections[indexPath.section].items[indexPath.row]
    }

    cell.textLabel?.textAlignment = .left
    cell.selectionStyle = .none
    cell.textLabel?.font = .boldSystemFont(ofSize: 20)
    cell.textLabel?.numberOfLines = 0
    cell.textLabel?.lineBreakMode = .byWordWrapping
    cell.textLabel!.text = customerList.customer

    return cell
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。