2016-10-12 25 views
1

ナビゲーションバーに検索バーがあり、ユーザーが入力を開始するときにいくつかの提案を表示したいが、uitableviewは検索結果と異なる必要があります。 例: ユーザーは 'wh'を入力し始めます:白、wheater、who、whoのリストを表示します。 そして、検索ボタンを押すと他のリストと結果が表示されます。別のuitableviewで提案を表示する検索バーを持つ方法

この場合、フィールドが異なるセルであるため、複雑さはuitableviewcellになります。

答えて

1

私は同じことを探している間にあなたの質問を見ました。今私はどのようにGoogleの提案を表示し、異なるテーブルビューでオートコンプリートを学びました。私はあなたがすでにそれを達成したと確信していますが、誰かがそれを必要とする場合には私はとにかく答えるでしょう。

まずあなたが検索バーのTextField editingDidBeginメソッドが呼び出されるときに、このように表示するテーブルビューを挿入する必要があります。

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 
    } 

ユーザーが私より検索

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

で行われたとき、私はビューからテーブルビューを削除する方法作成した提案マネージャーを使用して、提案と自動完成のデータを取得します。他のクラスと通信するためのプロトコルを作成してください: マネージャクラスを作成するよりも、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) 
    } 

} 

これで、どこからでもクラスを呼び出すことができます。

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

デリゲートメソッドを実装することを忘れないでください。

誰かを助けることを願っています。

乾杯。

関連する問題