ios - 使用 UISearchController 无法正确运行搜索

标签 ios swift uisearchcontroller

当我使用以下配置搜索时,我可以获得结果,但有几个问题:

  1. 当我搜索一个人时,我可以使用打印命令在底部的输出区域中看到结果,但它不会显示在屏幕上。如果我删除一个单词,它会显示结果!例如,如果我输入 Michael,则不会显示任何结果,但如果我删除 Michael 单词末尾的字母 L,则会正确显示结果。
  2. 有时搜索栏会充当第一响应者,有时则不会。我需要点击搜索两次。
  3. 如果我在搜索词后输入空格,应用程序会崩溃并出现“ fatal error :数组索引超出范围”错误。

我的代码如下:

   func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if shouldShowSearchResults {
            return filteredArray.count
        }
        else {
            return homesearchResults.count
        }
    }

    func updateSearchResultsForSearchController(searchController: UISearchController) {


    filteredTableData.removeAll(keepCapacity: false)

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

    if searchController.searchBar.text?.characters.count > 2

    {

    goSearch(searchController.searchBar.text!)

    }

    let array = (homesearchResults as NSArray).filteredArrayUsingPredicate(searchPredicate)


    filteredArray = array as! [String]



    self.homeTableView.reloadData() }

    func configureSearchController() {

    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search"
    searchController.searchBar.delegate = self
    searchController.searchBar.sizeToFit()

    let textFieldInsideSearchBar = searchController.searchBar.valueForKey("searchField") as! UITextField
    textFieldInsideSearchBar.font = UIFont(name: "Bauhaus", size: 19)


   searchController.searchBar.setImage(UIImage(named: "searchicon"), forSearchBarIcon: UISearchBarIcon.Search, state: UIControlState.Normal);


    homeTableView.tableHeaderView = searchController.searchBar}

    func searchBarTextDidBeginEditing(searchBar: UISearchBar)  {

    searchController.searchBar.becomeFirstResponder()}


func searchBarShouldBeginEditing(searchBar: UISearchBar) -> Bool {

    print ("searchBarSearchButton Clicked")

    return true
}


 func goSearch(searchWord: String)

{


    homeSearchBar.resignFirstResponder()


    let myUrl = NSURL(string: "http://bla.net/home.php")

    let request = NSMutableURLRequest(URL:myUrl!);
    request.HTTPMethod = "POST";

    let defaults = NSUserDefaults.standardUserDefaults()

    let user_id = defaults.integerForKey("dbID") as Int



    let postString = "searchWord=\(searchWord)&userId=\(user_id)";
    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request){
        data, response, error in


            do {
                let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary

                self.homesearchResults.removeAll(keepCapacity: false)
                self.homeimageResults.removeAll(keepCapacity: false)
                self.homeidResults.removeAll(keepCapacity: false)

                self.homeTableView.reloadData()

                if let parseJSON = json {

                    print(parseJSON)

                    if let friends  = parseJSON["friends"] as? [AnyObject]
                    {


                        for friendObj in friends
                        {
                            let fullName = (friendObj["name"] as! AnyObject)

                            self.homesearchResults.append(fullName as! String)




                            let friendRequestImage = (friendObj["thumb"] as! AnyObject)

                            self.homeimageResults.append(friendRequestImage as! String)


                            let NotID = (friendObj["id"] as! AnyObject)

                            self.homeidResults.append(NotID as! String)


                        }


                        self.homeTableView.reloadData()

                    } else if(parseJSON["message"] != nil)
                    {

                        let errorMessage = parseJSON["message"] as? String
                        if(errorMessage != nil)
                        {
                            self.displayAlertMessage(errorMessage!)
                        }
                    }
                }}
            catch {
                print("json error: \(error)")
            }

    }



    task.resume()

}

最佳答案

我相信您需要将 do/catch 语句包装在dispatch_async 调用中(在您的 doSearch 方法中):

dispatch_async(dispatch_get_main_queue(), { () -> Void in
     do {
            let json = try NSJSONSerialization.JSONObjectWithData(data!,
    ....
})

关于ios - 使用 UISearchController 无法正确运行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35107851/

相关文章:

ios - 如何更改 searchcontroller 中的 uitextfield 颜色?

iphone - 如何从 Swift 中的日历事件获取与会者列表及其电子邮件地址?

ios - 如何在 UITableView 中启用/禁用滚动?

ios - 从 web json 解析图像

ios - 对对象的类方法实例上的运行方法的困惑

ios - 如何在 Swift 3 中设置状态栏样式

ios - UISearchController:UITableView 的 Section Index 与 searchBar 重叠

ios - 多选快速搜索

ios - 计算用户 Action

ios - 购买应用内购买后保存更改