2017-06-16 2 views
0

J'ai implémenté la barre de recherche dans mon application. J'ai une donnée JSON de certains hôtels. (nom, image, adresse, numéro de portable, email). Je reçois le nom dans le résultat de la recherche, mais je veux obtenir toutes les données d'un hôtel en particulier. Alors, aidez-moi s'il vous plaît à implémenter la fonctionnalité de recherche. Je veux utiliser la méthode getter setter. S'il vous plaît aider. Merci d'avance!!comment utiliser la méthode getter setter pour la barre de recherche dans swift 3.1.1?

let str = self.catArr [indexPath.row] 
    let url1 = "myapi" 
    let url2 = url1+str 

    let allowedCharacterSet = (CharacterSet(charactersIn: " ").inverted) 
    if let url = url2.addingPercentEncoding(withAllowedCharacters: allowedCharacterSet) 
    { 
     Alamofire.request(url).responseJSON { (responseData) -> Void in 

      if (responseData.result.value) == nil 
      { 
       print("Error!!") 
      } 

      //if (responseData.result.value) != nil 
      else 
      { 
       let response = JSON(responseData.result.value!) 

       if let resData = response["data"].arrayObject 
       { 
        self.arrResponse1 = resData as! [[String: AnyObject]] 

        for item in self.arrResponse1 
        { 
         let name = item["name"] as! String 
         self.arrName.append(name) 

         let add = item["address"] as! String 
         self.arrAddress.append(add) 

         let web = item["website"] as! String 
         self.arrWebsite.append(web) 

         let email = item["email"] as! String 
         self.arrEmail.append(email) 

         let mob = item["mobile"] as! String 
         self.arrMobile.append(mob) 

         let city = item["city"] as! String 
         self.arrCity.append(city) 

         let state = item["state"] as! String 
         self.arrState.append(state) 

         let dist = item["district"] as! String 
         self.arrDistrict.append(dist) 

         let area = item["area"] as! String 
         self.arrArea.append(area) 

         let img = item["image"] as! String 
         self.arrImage.append(img) 

         let rating = item["rating"] as! String 
         self.arrRating.append(rating) 

         let id = item["id"] as! String 
         self.arrId.append(id) 
        } 
       } 
      } 
     } 
    } 

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
{ 
    filteredName = self.nameArr.filter({ (String) -> Bool in 
     let tmp: NSString = String as NSString 
     let range = tmp.range(of: searchText, options: NSString.CompareOptions.caseInsensitive) 
     return range.location != NSNotFound 
    }) 

    if(filteredName.count == 0) 
    { 
     searchActive = false; 
    } 

    else 
    { 
     searchActive = true; 
     print("Search Array = \(filteredName)") 
    } 

    self.infoTableView.reloadData() 
} 

// montrant dans tableview si (searchActive) { cell.lblName.text = self.filteredName [indexPath.row] }

else 
    { 
     let urlImage = str1+self.imageArr [indexPath.row]+".jpg" 

     cell.imgView.sd_setImage(with: URL(string: urlImage), placeholderImage: UIImage(named: "")) 
     cell.lblName.text = self.nameArr [indexPath.row] 
     cell.lblAddress.text = self.addressArr [indexPath.row] 
     cell.lblCity.text = self.cityArr [indexPath.row] 
     cell.lblPhone.text = self.mobileArr [indexPath.row] 
     cell.lblEmail.text = self.emailArr [indexPath.row] 
     cell.lblStar.text = self.ratingArr [indexPath.row] 

     cell.phoneString = self.mobileArr [indexPath.row] 
     cell.emailString = self.emailArr [indexPath.row] 
    } 
+0

Pouvez-vous montrer le code que vous obtenez ce 'données JSON'' et comment vous témoignez au' tableView' –

+0

@NiravD ::: en utilisant alamofire, je reçois une réponse de JSON et je suis stocker dans différents tableaux et les imprimer en ligne sage dans les étiquettes dans tableview. self.nameArr est le tableau de noms. – A21

+0

Pouvez-vous montrer votre exemple 'JSON' de votre qui nous donnera l'idée quelle clé vous accédez à partir de' JSON' –

Répondre

0

Au lieu d'avoir plusieurs choix pour stocker chaque valeur de ce que vous avez besoin est un tableau d'objet personnalisé class/struct et puis il est facile à utiliser filter avec elle.

struct Item { //Make some suitable name 
    let id: String 
    let name: String 
    let address: String 
    let website: String 
    let email: String 
    let mobile: String 
    let city: String 
    let state: String 
    let district: String 
    let area: String 
    let image: String 
    let rating: String 

    init(dictionary: [String:Any]) { 
     self.id = dictionary["id"] as? String ?? "Default Id" 
     self.name = dictionary["name"] as? String ?? "Default name" 
     self.address = dictionary["address"] as? String ?? "Default address" 
     self.website = dictionary["website"] as? String ?? "Default website" 
     self.email = dictionary["email"] as? String ?? "Default email" 
     self.mobile = dictionary["mobile"] as? String ?? "Default mobile" 
     self.city = dictionary["city"] as? String ?? "Default city" 
     self.state = dictionary["state"] as? String ?? "Default state" 
     self.district = dictionary["district"] as? String ?? "Default district" 
     self.area = dictionary["area"] as? String ?? "Default area" 
     self.image = dictionary["image"] as? String ?? "Default image" 
     self.rating = dictionary["rating"] as? String ?? "Default rating" 
    } 
} 

Maintenant, vous devez seulement deux tableau de type [Item] une pour les données normales et un pour filter données, déclareraient deux ensemble comme celui-ci.

var items = [Item]() 
var filterItems = [Item]() 

initialisés ce tableau items comme cette façon dans votre demande Alamofire.

let response = JSON(responseData.result.value!) 

if let resData = response["data"].arrayObject as? [[String: Any]] { 
    self.items = resData.map(Item.init) 
} 

Maintenant, utilisez ce tableau dans la méthode tableView comme ceci.

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    if searchActive { 
     return filterItems.count 
    } 
    return items.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! YourCustomCell 
    let item = searchActive ? filterItems[indexPath.row] : items[indexPath.row] 
    cell.lblName.text = item.name 
    cell.lblAddress.text = item.address 
    //...Set others detail same way 
    return cell 
} 

Maintenant, avec textDidChange filtrer votre tableau items de cette façon.

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
{ 
    filterItems = self.items.filter({ 
     $0.name.localizedCaseInsensitiveContains(searchText) 
    }) 

    if(filterItems.count == 0) { 
     searchActive = false 
    }    
    else { 
     searchActive = true 
     print("Search Array = \(filterItems)") 
    }   
    self.infoTableView.reloadData() 
} 
+0

tout fonctionne bien. Merci de votre aide.!! codage heureux. – A21

+0

@ A21 Bienvenue compagnon :) –