swift - 如何拥有一个显示不同uitableview建议的搜索栏

标签 swift uitableview uisearchbar autosuggest

我想在导航栏上有一个搜索栏,当用户开始输入时,显示一些建议,但另外 uitableview 必须与搜索结果不同。 例如: 用户开始输入“wh”:然后显示一个包含white、wheater、who、...的列表 然后,当按下搜索按钮时,会显示其他列表和结果。

在这种情况下, uitableviewcell 会变得更加复杂,因为它们是具有不同字段的不同单元。

最佳答案

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

首先,当调用searchBar文本字段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
    }

当用户完成搜索时,如何从 View 中删除表格 View

  func removeSuggestionsTableView() {
        suggestionsTableView?.removeFromSuperview()
        suggestionsTableView = nil
    }

我创建了建议管理器来获取建议和自动完成数据。创建与其他类通信的协议(protocol): 创建管理器类时,不要忘记调用 XMLParserDelegate。您必须解析来自 google 的 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)
    }

}

现在您可以像这样从任何地方调用您的类(class);

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

不要忘记实现委托(delegate)方法。

希望它对某人有帮助。

干杯。

关于swift - 如何拥有一个显示不同uitableview建议的搜索栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40009046/

相关文章:

ios - 更改 tableview 的内容插图

ios - Swift 自定义 TableViewCell 不会显示标签

uitableview - SearchBar、Custom Cell 和 setCell 方法 : fatal error: unexpectedly found nil while unwrapping an Optional value

ios - 截取屏幕截图,然后将其保存到相机胶卷。 swift 4.2,Xcode 10

ios - 如何在 SWIFTUI 主体内运行函数?

ios - 在 Combine 中处理发布者错误的最佳实践是什么? (从 CoreLocation 发布航向更新)

uitableview - 为什么我的 UITableView 在 iOS 7 中被截断?

ios - swift - 渲染 TableView 很慢

colors - Xcode 6 搜索栏颜色清晰变为黑色?

ios - 当 showsScopeBar=YES 时,iOS8 上的 UISearchBar 高度