搜索栏过滤错误的数据

时间:2017-08-22 04:02:23

标签: swift

不同地请求您的帮助 我正在尝试使用搜索栏过滤表格视图,但我得到的数据不在正确的位置, 我曾多次尝试弄明白,但没有任何机会,我得到的结果只是第一行无关紧要我输入哪个房间号码 我粘贴了下面的代码,非常感谢您的帮助

final let urlString = "http://ccm-hotels.com/ccmandroid/api/getteams.php"

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!

@IBAction func BackToMenu(_ sender: UIBarButtonItem) {
    let MainMenu = self.storyboard?.instantiateViewController(withIdentifier: "MainMenu") as! MainMenu
    self.navigationController?.pushViewController(MainMenu, animated: true)
}


    var openCaseRoomArray: [String] = []
    var openCaseNameArray: [String] = []



var openCaseRoomArrayF: [String] = []

var inSearchMode = false

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self
    searchBar.delegate = self
    searchBar.returnKeyType = UIReturnKeyType.done
    openCaseRoomArrayF = openCaseRoomArray

    let alertController = UIAlertController(title: nil, message: "Please wait\n\n", preferredStyle: .alert)
    let spinnerIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge)
    spinnerIndicator.center = CGPoint(x: 135.0, y: 65.5)
    spinnerIndicator.color = UIColor.black
    spinnerIndicator.startAnimating()
    alertController.view.addSubview(spinnerIndicator)
    self.present(alertController, animated: false, completion: nil)
    let when = DispatchTime.now() + 5
    DispatchQueue.main.asyncAfter(deadline: when){
        // your code with delay
        alertController.dismiss(animated: true, completion: nil);}


    self.downloadJsonWithURL()

    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func downloadJsonWithURL() {
    let url=URL(string:"http://ccm-hotels.com/ccmandroid/api/getteams.php")
    do {
        let allContactsData = try Data(contentsOf: url!)
        let allContacts = try JSONSerialization.jsonObject(with: allContactsData, options: JSONSerialization.ReadingOptions.allowFragments) as! [String : AnyObject]
        if let arrJSON = allContacts["CurrentOpenCases"] {
            for index in 0...arrJSON.count-1 {
                let aObject = arrJSON[index] as! [String : AnyObject]

                if let Room = aObject["RoomNumber"] as? String {
                    openCaseRoomArray.append(Room)
                }
                if let Name = aObject["GuestName"] as? String {
                    openCaseNameArray.append(Name)
                }

            }
        }

        self.tableView.reloadData()
    }
    catch {

    }
}


func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if inSearchMode {
        return openCaseRoomArrayF.count
    }
    return openCaseRoomArray.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! TableViewCell

    if inSearchMode {
        cell.openCaseRoom.text = self.openCaseRoomArrayF[indexPath.row]
        cell.openCaseName.text = self.openCaseNameArray[indexPath.row]

    }else{
    cell.openCaseRoom.text = self.openCaseRoomArray[indexPath.row]
    cell.openCaseName.text = self.openCaseNameArray[indexPath.row]


}
     return cell

}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {   
   let vc = self.storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController


    vc.dopenCaseRoomString = openCaseRoomArray[indexPath.row]
    vc.openCaseNameString = openCaseNameArray[indexPath.row]



    self.navigationController?.pushViewController(vc, animated: true)
}


func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text == nil || searchBar.text == "" {
        inSearchMode = false
        view.endEditing(true)
        tableView.reloadData()
    } else {
        inSearchMode = true
        openCaseRoomArrayF = openCaseRoomArray.filter({$0 == searchBar.text})
        tableView.reloadData()
    }
}

}

1 个答案:

答案 0 :(得分:0)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell方法中,当您在self.openCaseNameArray更新搜索结果时,您会显示self.openCaseRoomArrayF的名称。当您获得api响应时,您将在两个阵列中分配空间及其相应的名称,但是当您在self.openCaseRoomArrayF中搜索并更新搜索结果时,索引会发生变化。现在 openCaseNameArray openCaseRoomArray 处于匹配索引中,但 openCaseNameArray openCaseRoomArrayF 不在同一匹配索引中。因此,如果您从openCaseNameArray腾出空间,则无法在openCaseRoomArrayF中获得相应的名称。

尝试制作一个班级(例如房间)并将房间班级object存储在array中。从array搜索并显示。无需维护数组。