0

こんにちは、検索機能に非常に奇妙な問題があります。検索機能の実装に成功しました。バックエンド サービスからデータを取得しています。問題は、入力されたキーワードに従って、ある段階でデータが提案領域 (tableView) に正確にロードされないことです。また、結果をコンソールにも出力して、キーワードに対して正確な結果が得られているかどうかを確認し、コンソールに正確な結果が表示されますが、提案領域だけで正確な結果がロードされないことがあります。たとえば、私のアプリで都市「ラホール」を検索したい場合。「ラホール」と全角で入力しました

これを示していますここに画像の説明を入力

しかし、xアイコンまたはバックスペースを押して「e」を削除すると、正確な結果が表示されます

ここに画像の説明を入力

例として示しているだけです。これはほぼ常に発生しています。私のコードを見て、私が何をしているのか見てください。

class CountryTableViewController: UITableViewController, UISearchResultsUpdating {

    var dict = NSDictionary()
    var filteredKeys = [String]()

    var resultSearchController = UISearchController()

    var newTableData = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        self.resultSearchController = ({

            let controller  = UISearchController(searchResultsController: nil)
            controller.searchResultsUpdater = self
            controller.dimsBackgroundDuringPresentation = false
            controller.searchBar.sizeToFit()
            self.tableView.tableHeaderView = controller.searchBar
            return controller


        })()

        self.tableView.reloadData()
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if (self.resultSearchController.active) {

            return self.filteredKeys.count
        } else {

            return dict.count
        }

    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CountryTableViewCell

        if(self.resultSearchController.active){





                let cityName = (((self.dict["\(indexPath.row)"] as?NSDictionary)!["Country"] as?NSDictionary)!["city_name"] as?NSString)

               let stateName  = (((self.dict["\(indexPath.row)"] as?NSDictionary)!["Country"] as? NSDictionary)!["state_name"] as? NSString)

                 let shortName  = (((self.dict["\(indexPath.row)"] as?NSDictionary)!["Country"] as? NSDictionary)!["short_country_name"] as? NSString)


            if (cityName != "-" || shortName != "-"){
                cell.stateNameLabel.text = stateName as? String
                cell.cityNameLabel.text = cityName as? String
                 cell.shortNameLabel.text = shortName as? String

            }

                      return cell

        }else{
            if let cityName = (((self.dict["\(indexPath.row)"] as?NSDictionary)!["Country"] as?NSDictionary)!["city_name"] as?NSString){
            cell.cityNameLabel.text = cityName as String
            }
            return cell
        }



    }



    func updateSearchResultsForSearchController(searchController: UISearchController) {

        let searchWord = searchController.searchBar.text!

        getCountriesNamesFromServer(searchWord)

        self.filteredKeys.removeAll()

        for (key, value) in self.dict {

            let valueContainsCity: Bool = (((value as? NSDictionary)?["Country"] as? NSDictionary)?["city_name"] as? String)?.uppercaseString.containsString(searchWord.uppercaseString) ?? false

            let valueContainsCountry: Bool = (((value as? NSDictionary)?["Country"] as? NSDictionary)?["country_name"] as? String)?.uppercaseString.containsString(searchWord.uppercaseString) ?? false

            if valueContainsCity || valueContainsCountry{ self.filteredKeys.append(key as! String) }




        }

        self.tableView.reloadData()
    }




    func getCountriesNamesFromServer(searchWord:String){


        let url:String = "http://localhost"
        let params = ["keyword":searchWord]



        ServerRequest.postToServer(url, params: params) { result, error in

            if let result = result {
                print(result)



                self.dict = result

            }
        }

    }

}
4

1 に答える 1

2

リクエストの終了時ではなく開始後にテーブルをリロードしているため、dict には最後に実行したクエリの結果が残っています。

実行後、ネットワーク要求の完了ハンドラーをupdateSearchResults..呼び出した後のメソッド内のすべてを移動しますgetCountriesNamesFromServerself.dict = result

新しいメソッドは次のようになります。

func updateSearchResultsForSearchController(searchController: UISearchController) {    
    let searchWord = searchController.searchBar.text!    
    getCountriesNamesFromServer(searchWord)        
}

func getCountriesNamesFromServer(searchWord:String) {        
    let url:String = "http://localhost"
    let params = ["keyword":searchWord]

    ServerRequest.postToServer(url, params: params) { result, error in    
        if let result = result {
            print(result)

            self.dict = result

            self.filteredKeys.removeAll()

            for (key, value) in self.dict {
                let valueContainsCity: Bool = (((value as? NSDictionary)?["Country"] as? NSDictionary)?["city_name"] as? String)?.uppercaseString.containsString(searchWord.uppercaseString) ?? false

                let valueContainsCountry: Bool = (((value as? NSDictionary)?["Country"] as? NSDictionary)?["country_name"] as? String)?.uppercaseString.containsString(searchWord.uppercaseString) ?? false

                if valueContainsCity || valueContainsCountry {
                    self.filteredKeys.append(key as! String)
                }
            }

            self.tableView.reloadData()   
        }               
    }
}
于 2016-03-02T21:03:07.937 に答える