2016-02-24 4 views
1

Я строю приложение в быстром запросе, чтобы иметь возможность искать города, и я хотел бы, чтобы поиск работал с автозаполнением. Я хочу сделать что-то вроде, если пользователь вводит какой-либо символ или слово в поле поиска, он извлекает результат из базы данных mysql, которая начинается с этого символа или слова, и показывает результат в автоматическом предложении или автоматически завершается. мой бэкэнд-сервис готов. Единственная проблема - я не знаю, как я могу реализовать эту функцию. В данный момент, что мой код делает, когда пользователь вводит что-то в строке поиска, он нажимает кнопку поиска на клавиатуре, а затем приходит результат. надеюсь, вы поймете, что я говорю. Вот мой текущий кодРезультаты поиска с автозавершением

class ViewController: UIViewController, UITableViewDataSource, UISearchBarDelegate { 
    @IBOutlet weak var mySearchBar: UISearchBar! 
    @IBOutlet weak var myTableView: UITableView! 
    var dict = NSDictionary() 
    var searchResults = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return searchResults.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     let myCell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) 

     myCell.textLabel?.text = searchResults[indexPath.row] 

     return myCell 

    } 

    func searchBarSearchButtonClicked(searchBar: UISearchBar) 
    { 
     if(searchBar.text!.isEmpty) 
     { 
      return 
     } 

     doSearch(searchBar.text!) 

    } 



    func doSearch(searchWord: String) 

    { 

     mySearchBar.resignFirstResponder() 

     let myUrl = NSURL(string: "http://localhost/myproject") 
     let request = NSMutableURLRequest(URL:myUrl!); 

     let params = ["city" : searchWord] 
     do { 

      let data = try NSJSONSerialization.dataWithJSONObject(params, options: .PrettyPrinted) 



      request.HTTPBody = data 


     } catch { 
      //handle error. Probably return or mark function as throws 
      print("error is \(error)") 
      //return 
     } 


     request.HTTPMethod = "POST"; 



     request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
     request.addValue("application/json", forHTTPHeaderField: "Accept") 
     let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response: NSURLResponse?, error:NSError?) -> Void in 

      dispatch_async(dispatch_get_main_queue()) { 

      if error != nil 
      { 
       // display an alert message 
       self.displayAlertMessage(error!.localizedDescription) 
       return 
      } 
       let json: NSDictionary? 
     do { 
      json = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary 

      self.searchResults.removeAll(keepCapacity: false) 
      self.myTableView.reloadData() 

      if let parseJSON = json { 
       print(parseJSON) 

       // var index = 0 
       self.dict = parseJSON 
       print("count is \(self.dict.count)") 
       for var i = 0; i < self.dict.count - 1; i++ { 
        let cityname = (((self.dict["\(i)"] as?NSDictionary)!["City"] as?NSDictionary)!["name"] as?NSString)! as String 
        self.searchResults.append(cityname) 
       } 



         self.myTableView.reloadData() 


      } 

      } catch { 
       print(error); 
      } 

      } 


      }) 


     task.resume() 

    } 


    func displayAlertMessage(userMessage: String) 
    { 
     let myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.Alert); 
     let okAction = UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil) 
     myAlert.addAction(okAction); 
     self.presentViewController(myAlert, animated: true, completion: nil) 
    } 

    @IBAction func cancelButtonTapped(sender: AnyObject) { 
     mySearchBar.text = "" 
     mySearchBar.resignFirstResponder() 
    } 




} 
+0

Я действительно не имеют ответа, но вы смотрели на этот учебник от Ray Wenderlich: http://www.raywenderlich.com/113772/uisearchcontroller-tutorial. Там они используют протокол UISearchResultsUpdating, который имеет этот метод: 'updateSearchResultsForSearchController:' который, как говорится в документации, - это: «Вызывается, когда панель поиска становится первым ответчиком или когда пользователь вносит изменения внутри панели поиска. " Может быть, это поможет вам – pbodsk

+0

@pbodsk Хорошо, я проверю – hellosheikh

ответ

0

В порядке я успешно выполнил поиск. Вот мой код

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] 
      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 
     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 

      } 
     } 

    } 

} 
0

Вот один метод:

  • Сделайте ViewController делегатом вашего текстового поля поиска.
  • Реализация делегата -

  • SearchBar: textDidChange:

  • Реализовать метод сказать 'UpdateResults' Этот метод должен делать these-

    а. Проверьте SearchBar изменился, в этом случае установите на SearchResults к нулю (Сделать экземпляр Var SearchResults, что является факультативным массивом.

    б. Выполните вашу работу сети, чтобы получить результаты асинхронно (как вы уже делаете).

    с. При получении результатов, добавьте их к SearchResults (по создавая его, если он равен нулю)

    д. После того, как все результаты поиска добавляются, отправка на основном потоке, и сделать таблицу соответствующие результаты для

+0

Я новичок, возможно, что вы можете написать код здесь – hellosheikh