首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现搜索功能

实现搜索功能
EN

Stack Overflow用户
提问于 2016-02-24 14:10:13
回答 1查看 71关注 0票数 0

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

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

代码语言:javascript
复制
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

                }
            }

        }

    }

如果我尝试设置新的州和国家数组,那么数据就不会正确显示。城市不属于他自己的州。所以我怎样才能正确地遵守命令。

阵列:

dict

代码语言:javascript
复制
 0 =     {
        City =         {
            code = 10430;
            "country_id" = 244;
            id = 8932;
            name = Laudium;
            "state_id" = 4381;
            "updated_at" = "<null>";
        };
        Country =         {
            id = 244;
            name = "South Africa";
        };
        State =         {
            "country_id" = 244;
            id = 4381;
            name = Gauteng;
        };
    }; etc

newTableData

["Lynnwood", "Lyndhurst", "Laudium"]

filterTableData

代码语言:javascript
复制
["Laudium", "La Lucia", "Lansdowne"] etc
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-24 15:38:35

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

代码语言:javascript
复制
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()
}

使用以下已过滤的键填充表视图: let key = self.filteredKeysindexPath.row

代码语言:javascript
复制
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.filteredDictionary)并使用它填充tableView。

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

您应该尝试使用这样的块完成来修改getCityNamesFromServer:方法:

代码语言:javascript
复制
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()
   }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35604446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档