如何使用搜索栏显示具有不同uitableview的建议

时间:2016-10-12 21:57:05

标签: swift uitableview uisearchbar autosuggest

我希望在导航栏上有一个搜索栏,当用户开始输入时,会显示一些建议,但另外,uitableview必须与搜索结果不同。 例如: 用户开始输入' wh':然后会显示一个包含白名单,清单,谁,...的列表 然后当按搜索按钮显示其他列表并显示结果时。

在这种情况下,复杂性出现在uitableviewcell上,因为它们是具有不同字段的不同单元格。

1 个答案:

答案 0 :(得分:2)

我在寻找同样的事情时看到了你的问题。现在我已经学会了如何在不同的tableview中显示谷歌建议和自动完成。我相信你已经完成了它,但无论如何我会回答,以防其他人需要它。

首先,当调用searchBar textfield editingDidBegin方法时,你需要插入tableview来查看:

    func showSuggestionsTableView() {
        if suggestionsTableView == nil {
            //I get keyboardhight dynamically and 60 is my navigationBar height.
            let availHeight = Globals.deviceScreenSize!.size.height - 60 - CGFloat(keyboardHeight)
            suggestionsTableView = UITableView(frame: CGRect(x: 0, y: 82, width: Globals.deviceScreenSize!.size.width, height: availHeight), style: .grouped)
            suggestionsTableView?.delegate = self
            suggestionsTableView?.dataSource = self

            self.view.insertSubview(suggestionsTableView!, aboveSubview: webViewContainer)
        suggestionsTableView?.isHidden = false
    }

当用户完成搜索

时,如何从视图中删除tableview
  func removeSuggestionsTableView() {
        suggestionsTableView?.removeFromSuperview()
        suggestionsTableView = nil
    }

我创建了建议管理器以获取建议和自动填充数据。创建协议以与其他类通信: 要创建您的经理课程,不要忘记调用XMLParserDelegate。您必须解析来自谷歌的XML数据。

protocol GoogleAutoComplateManagerDelegate {
    func didDownloadResults(resultArr: [String]?)
    func didFail(String)
}

class GoogleAutoComplateManager : NSObject, XMLParserDelegate {

var delegate : GoogleAutoComplateManagerDelegate?
static let sharedInstance = GoogleAutoComplateManager()

var parser = XMLParser()
var resultArr = [String]()



func getAutoComplateResults(stringToSearch: String) {
    if stringToSearch != "" {
        resultArr = []
        //You can find about this google url parameters online. For now 'hl' is language parameter.
        let googleURL = "http://suggestqueries.google.com/complete/search?output=toolbar&hl=tr&ie=utf8&oe=utf8&q="
        let searchURL = URL(string: googleURL + stringToSearch.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!)

        parser = XMLParser(contentsOf: searchURL!)!
        self.parser.delegate = self

        let success:Bool = self.parser.parse()

        if success {
            delegate?.didDownloadResults(resultArr: resultArr)
        }
        else {
            delegate?.didFail("parser error")
        }

    }
}


func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
    //This delegate method loops through every suggestion in xml file and parses it
    if (elementName == "suggestion") {
        let suggestion : String = attributeDict["data"]!
        resultArr.append(suggestion)
    }


 }

    func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
        //Parser delegate method for error handling while parsing
        delegate?.didFail(parseError.localizedDescription)
    }

}

现在你可以从这样的地方打电话给你的班级;

GoogleAutoComplateManager.sharedInstance.delegate = self
GoogleAutoComplateManager.sharedInstance.getAutoComplateResults(stringToSearch: yourSearchString)

不要忘记实施委托方法。

希望它有所帮助。

干杯。