Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 实现搜索功能_Ios_Swift_Nsarray_Nsdictionary_Uisearchcontroller - Fatal编程技术网

Ios 实现搜索功能

Ios 实现搜索功能,ios,swift,nsarray,nsdictionary,uisearchcontroller,Ios,Swift,Nsarray,Nsdictionary,Uisearchcontroller,你好,我已经在我的应用程序上实现了自动完成搜索。我在mysql数据库和应用程序中存储了城市,当用户键入任何字符或单词时,应用程序将从数据库中获取结果并显示出来。现在我遇到了一个小的编程问题,我不知道如何解决它 问题是在同一个数组中,我得到了一个城市,我也得到了国家名称和州名称。由于我只在城市上实现了搜索,而不是在州和国家,因此我实际上需要根据用户搜索城市显示的那些行的其他列(州、国家)。为了更好地理解,我将把代码粘贴到这里 class CityTableViewController: UITa

你好,我已经在我的应用程序上实现了自动完成搜索。我在mysql数据库和应用程序中存储了城市,当用户键入任何字符或单词时,应用程序将从数据库中获取结果并显示出来。现在我遇到了一个小的编程问题,我不知道如何解决它

问题是在同一个数组中,我得到了一个城市,我也得到了国家名称和州名称。由于我只在城市上实现了搜索,而不是在州和国家,因此我实际上需要根据用户搜索城市显示的那些行的其他列(州、国家)。为了更好地理解,我将把代码粘贴到这里

class  CityTableViewController: UITableViewController, UISearchResultsUpdating {
    var dict = NSDictionary()
    var filterTableData = [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.filterTableData.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){

                cell.cityNameLabel.text = filterTableData[indexPath.row]

                cell.countryNameLabel.text =  get the country name

                 cell.stateNameLabel.text =  get stateName
                return cell

            }else{

                cell.cityNameLabel.text = (((self.dict["\(indexPath.row)"] as?NSDictionary)!["City"] as?NSDictionary)!["name"] as?NSString)! as String
                return cell
            }



        }

        func updateSearchResultsForSearchController(searchController: UISearchController) {
            filterTableData.removeAll(keepCapacity: false)
            let searchWord = searchController.searchBar.text!

            getCityNamesFromServer(searchWord)

            let searchPredict = NSPredicate(format: "SELF CONTAINS[c] %@", searchController.searchBar.text!)
            print("searchPredict is \(searchController.searchBar.text!)")

            for var i = 0; i < self.dict.count; i++ {
                let cityName = (((self.dict["\(i)"] as?NSDictionary)!["City"] as?NSDictionary)!["name"] as?NSString)! as String

         let countryName = (((self.dict["\(i)"] as?NSDictionary)!["Country"] as?NSDictionary)!["name"] as?NSString)! as String

let stateName = (((self.dict["\(i)"] as?NSDictionary)!["State"] as?NSDictionary)!["name"] as?NSString)! as String
            newTableData.append(cityname)
            }

            let array = (newTableData as NSArray).filteredArrayUsingPredicate(searchPredict)
            print("array is\(array)")
            filterTableData = array as! [String]
            self.tableView.reloadData()
        }






        func getCityNamesFromServer(searchWord:String){


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



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

                if let result = result {
                    print(result)

                    self.dict = result

                }
            }

        }

    }

您应该在字典中搜索匹配项,并将匹配的键存储在数组中,并在结果中引用这些键

func updateSearchResultsForSearchController(searchController: UISearchController) {

    let searchWord = searchController.searchBar.text!

    getCityNamesFromServer(searchWord)

    self.filteredKeys.removeAll()

    for (key, value) in self.dict {
        let valueContainsSearchWord: Bool = (((value as? NSDictionary)?["City"] as? NSDictionary)?["name"] as? String)?.uppercaseString.containsString(searchWord.uppercaseString) ?? false
        if valueContainsSearchWord {
            self.filteredKeys.append(key as! String)
        }
    }

    self.tableView.reloadData()
}
使用以下过滤键填充tableview: 让key=self.filteredKeys[indexPath.row]

let dictionary = self.dict[key] as! NSDictionary

cell.cityNameLabel.text = ((dictionary["City"] as? NSDictionary)!["name"] as? NSString)! as String

cell.countryNameLabel.text = ((dictionary["Country"] as? NSDictionary)!["name"] as? NSString)! as String

cell.stateNameLabel.text = ((dictionary["State"] as? NSDictionary)!["name"] as? NSString)! as String

return cell
只需保存此筛选字典(self.filteredictionary)并使用它填充tableView

我认为另一个问题是,当您从
updateSearchResultsForSearchController:
调用服务器的搜索方法(
getCityNamesFromServer:
)时,来自服务器的响应是异步的,之后的过程使用旧的字典数据,因为新的字典数据在处理时还没有准备好

您应该尝试修改
getCityNamesFromServer:
方法,使用如下块完成方式:

func updateSearchResultsForSearchController(searchController: UISearchController) {
    // Get search word    
    getCityNamesFromServer(searchWord) { () -> Void in
            // Rest of the code comes here
    }
}
func getCityNamesFromServer(searchWord:String, completionHandler: (() -> Void) ) {
    let url:String = "http://localhost/"
    let params = ["city":searchWord]

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

        if let result = result {
            print(result)

            self.dict = result

        }
        completionHandler()
   }

}

你能展示一下数组中的数据到底是什么样子的吗?好的,你想看看字典中的原始数据,还是想看看filtertabledata数组?你能告诉我代码中的变量名吗@LarmeOne对象(不是整个数组)可能很有趣。@Larme我已经更新了我的问题我想你还没有清楚地理解我的问题@如果我误解了,卡迪亚可能会很抱歉,但这仍然可能是个问题。主要问题是什么?我在你的代码中找到了这个,没有继续阅读。没问题。。好吧,问题是我不知道如何保存其他变量的引用。我的意思是看到服务器的结果,而不仅仅是城市。它也有城市、国家和州的名称。在tableview上,当用户搜索城市时,我想显示州和国家名称以及城市。我怎么能那样做?你明白我说的话吗?它变得很难解释了?所以你有字典,搜索城市名称,如果城市名称匹配,你也想显示城市的州和国家?
let dictionary = self.dict[key] as! NSDictionary

cell.cityNameLabel.text = ((dictionary["City"] as? NSDictionary)!["name"] as? NSString)! as String

cell.countryNameLabel.text = ((dictionary["Country"] as? NSDictionary)!["name"] as? NSString)! as String

cell.stateNameLabel.text = ((dictionary["State"] as? NSDictionary)!["name"] as? NSString)! as String

return cell
func updateSearchResultsForSearchController(searchController: UISearchController) {
    // Get search word    
    getCityNamesFromServer(searchWord) { () -> Void in
            // Rest of the code comes here
    }
}
func getCityNamesFromServer(searchWord:String, completionHandler: (() -> Void) ) {
    let url:String = "http://localhost/"
    let params = ["city":searchWord]

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

        if let result = result {
            print(result)

            self.dict = result

        }
        completionHandler()
   }

}