首页 > 解决方案 > 我想知道为什么结果在表格视图中重复

问题描述

我通过 Web 服务器的 php 文件获取值。

我希望在搜索时从 DB 中获取结果。

我的代码现在有两个问题。

  1. 不包含在数据库中的值中的拼写也会产生结果。

  2. 结果反复出现。

首先,这是我得到的 json 结果。

[
  {
    "name" : "name1",
    "id" : "1"
  },
  {
    "name" : "name2",
    "id" : "2"
  },
  {
    "name" : "name3",
    "id" : "3"
  },
  {
    "name" : "name4",
    "id" : "4"
  },
  {
    "name" : "name5",
    "id" : "5"
  },
  {
    "name" : "name6",
    "id" : "6"
  },
  {
    "name" : "name7",
    "id" : "7"
  },
  {
    "name" : "name8",
    "id" : "8"
  },
  {
    "name" : "name9",
    "id" : "9"
  },
  {
    "name" : "name10",
    "id" : "10"
  },
  {
    "name" : "name11",
    "id" : "11"
  },
  {
    "name" : "name12",
    "id" : "12"
  }
]

但是在模拟器中,结果是这样的。

name1
name1
name2
name1
name2
name3
.
.
.

我想知道为什么结果会这样。

这是我的代码。

import UIKit
import Alamofire
import SwiftyJSON

class MyTableViewController: UITableViewController, UISearchBarDelegate {
    
    var arrID = [String]()
    var arrName = [String]()
    
    var filteredData = [String]()
    
    @IBOutlet weak var searchBar: UISearchBar!
    
    @IBOutlet var mytableview: UITableView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        searchBar.delegate = self
        self.mytableview.delegate = self
        self.mytableview.dataSource = self
        
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return filteredData.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")! as UITableViewCell
        
        cell.textLabel?.text = filteredData[indexPath.row]
        
        return cell
    }
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        let url = "http://url/name.php?name=" + searchText
        print(url)
        
        AF.request(url, method: .get).responseJSON { (myresponse) in
            switch myresponse.result {
            case .success:
                let myresult = try? JSON(data: myresponse.data!)
                print(myresult!)
                
                let resultArray = myresult!
                
                self.arrID.removeAll()
                self.arrName.removeAll()
                
                for i in resultArray.arrayValue {
                    let id = i["id"].stringValue
                    self.arrID.append(id)
                    let name = i["name"].stringValue
                    self.arrName.append(name)
                    self.filteredData.append(contentsOf: self.arrName)
                }
                
                if searchText == "" {
                    self.filteredData = []
                } else {
                    for data in self.filteredData {
                        if data.lowercased().contains(searchText.lowercased()) {
                            self.filteredData.append(data)
                        }
                    }
                }
                
                self.mytableview.reloadData()
                
            case .failure:
                print(myresponse.error!)
            }
        }
    }
}

标签: iosswift

解决方案


你可能想改变这个:

for i in resultArray.arrayValue {
    let id = i["id"].stringValue
    self.arrID.append(id)
    let name = i["name"].stringValue
    self.arrName.append(name)
    self.filteredData.append(contentsOf: self.arrName)
}

对此:

for i in resultArray.arrayValue {
    let id = i["id"].stringValue
    self.arrID.append(id)
    let name = i["name"].stringValue
    self.arrName.append(name)
}
self.filteredData.append(contentsOf: self.arrName)

不过,我很困惑你为什么要这样做:

for data in self.filteredData {
    if data.lowercased().contains(searchText.lowercased()) {
        self.filteredData.append(data)
    }
}

推荐阅读