2017-06-29 3 views
1

J'ai besoin de votre aide! Je ne sais pas comment modifier un tableau qui est inséré sur un TableCell à partir d'informations que j'ai dans un autre ViewController. C'est un peu foiré, mais je vais vous montrer par mon code.Comment modifier un tableau qui est inséré sur un TableCell à partir d'informations que j'ai dans un autre ViewController?

Ici, j'ai un ViewController conformées par de nombreux commutateurs qui correspondent à différentes catégories de coupons, c'est le code:

class FiltersViewController: UIViewController { 

    @IBOutlet weak var restaurantsSwitch: UISwitch! 

    @IBOutlet weak var sportsSwitch: UISwitch! 



    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    @IBAction func returnHome(_ sender: Any) { 
     let vc = self.storyboard!.instantiateViewController(withIdentifier: "home") as! HomeViewController 
     self.present(vc, animated: false, completion: nil) 
    } 


    @IBAction func restaurants(_ sender: UISwitch) { 
     if restaurantsSwitch.isOn == true{ 
      tuxtlaSwitch.isOn = false 
      sevillaSwitch.isOn = false 
      coapaSwitch.isOn = false 
      coyoacanSwitch.isOn = false 
      universidadSwitch.isOn = false 
      polancoSwitch.isOn = false 
     } 
    } 

    @IBAction func sports(_ sender: UISwitch) { 
     if sportsSwitch.isOn == true{ 
      tuxtlaSwitch.isOn = false 
      sevillaSwitch.isOn = false 
      coapaSwitch.isOn = false 
      coyoacanSwitch.isOn = false 
      universidadSwitch.isOn = false 
      polancoSwitch.isOn = false 
     } 
    } 

} 

Je ne vous ai montre deux commutateurs à l'exemple dans le but de ne pas remplir ceci avec beaucoup de code, mais il y a comme 15 commutateurs.

et dans l'autre ViewController, qui est relié à celui-ci, le HomeViewController, contient des coupons qui provient d'un JSON, et se conforme un réseau de dix éléments affichés sur un TableViewCell, le code:

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var data : NSArray = [] 

    var mainData : NSArray = [] 

    var couponsImg : [UIImage] = [] 

    var couponsTitle : [String] = [] 

    var couponsDesc : [String] = [] 

    var couponsCat : [String] = [] 



    func getCoupons(){ 

     let miURL = URL(string: RequestConstants.requestUrlBase) 

     let request = NSMutableURLRequest(url: miURL!) 

     request.httpMethod = "GET" 

     if let data = try? Data(contentsOf: miURL! as URL) { 

      do { 

       let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary 

       let parseJSON = json 

       let object = parseJSON?["object"] as! NSDictionary 

       let mainCoupon = object["mainCoupon"] as! NSArray 

       let coupons = object["coupons"] as! NSArray 

       self.mainData = mainCoupon 

       self.data = coupons 

       self.couponImg1 = (mainCoupon[0] as AnyObject).value(forKey: "urlImage") as! String 

       self.couponImg2 = (mainCoupon[1] as AnyObject).value(forKey: "urlImage") as! String 

       self.couponTitle1 = (mainCoupon[0] as AnyObject).value(forKey: "nameStore") as! String 

       self.couponTitle2 = (mainCoupon[1] as AnyObject).value(forKey: "nameStore") as! String 

       self.couponDesc1 = (mainCoupon[0] as AnyObject).value(forKey: "promoDescription") as! String 

       self.couponDesc2 = (mainCoupon[1] as AnyObject).value(forKey: "promoDescription") as! String 

       self.couponCat1 = (mainCoupon[0] as AnyObject).value(forKey: "category") as! String 

       self.couponCat2 = (mainCoupon[1] as AnyObject).value(forKey: "category") as! String    

       self.couponsImg = [couponImage1!, couponImage2!, couponImage3!, couponImage4!, couponImage5!, couponImage6!, couponImage7!, couponImage8!, couponImage9!, couponImage10!] 

       self.couponsTitle = [couponTitle1, couponTitle2, couponTitle3, couponTitle4, couponTitle5, couponTitle6, couponTitle7, couponTitle8, couponTitle9, couponTitle10] 

       self.couponsDesc = [couponDesc1, couponDesc2, couponDesc3, couponDesc4, couponDesc5, couponDesc6, couponDesc7, couponDesc8, couponDesc9, couponDesc10] 

       self.couponsCat = [couponCat1, couponCat2, couponCat3, couponCat4, couponCat5, couponCat6, couponCat7, couponCat8, couponCat9, couponCat10] 

      } catch { 

       let error = ErrorModel() 

       error.phrase = "PARSER_ERROR" 

       error.code = -1 

       error.desc = "Parser error in get Notifications action" 

      } 

     }  

    } 



    @IBAction func showFilters(_ sender: Any) { 

     let vc = self.storyboard!.instantiateViewController(withIdentifier: "filters") as! FiltersViewController 

     self.present(vc, animated: false, completion: nil) 

      } 



    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! HomeTableViewCell 

     cell.couponImg.image = couponsImg[indexPath.row] 

     cell.couponTitle.text = couponsTitle[indexPath.row] 

     cell.couponDescription.text = couponsDesc[indexPath.row] 

     cell.couponCategory.text = couponsCat[indexPath.row] 

    return cell 

    } 

(Encore une fois, je ne vous ai montré que deux coupons pour l'exemple). La chose est que j'ai besoin d'appliquer des filtres aux coupons sur le TableCell. La première fois que la vue apparaît, elle montre correctement les 10 coupons, mais quand je vais aux filtres et que je les mets dessus, ça ne fait pas de différence, la méthode que j'essayais d'utiliser était quelque chose comme ça, d'abord instance de la classe FiltersViewController:

var filters = FilterViewController() 

if filters.isMovingToParentViewController == true { 
      if filters.restaurantsSwitch.isOn == false { 
       self.couponsImg.remove(at: 0) 
       self.couponsImg.remove(at: 1) 
       self.couponsImg.remove(at: 2) 
      } 

      if filters.sportsSwitch.isOn == false { 
       self.couponsImg.remove(at: 3) 
       self.couponsImg.remove(at: 4) 
       self.couponsImg.remove(at: 5) 
      } 
     } 

Dans l'exemple ci-dessous, je suis en train de dire que si le restaurant a éteindre, je vais supprimer les coupons correspondants de la catégorie de restaurant, et même avec l'interrupteur sportif. Mais d'abord je ne sais pas où inclure cette logique, dans quelle méthode? Et aussi je ne sais pas si cette instruction est correcte pour mes fins. Quelqu'un peut-il me donner un coup de main s'il vous plaît ???

Répondre

3

Votre logique ne fonctionne pas car vous instanciez un nouveau FilterViewController, différent de l'écran FilterViewController associé à votre écran.

Vous pouvez résoudre ce problème en utilisant un délégué.

d'abord, créez le délégué:

protocol FilterDelegate { 
    func updateTable() } 

Ensuite, dans votre FilterViewController ajoutez cette ligne:

weak var delegate:FilterDelegate? 

Vous HomeViewController doivent se conformer à ce délégué, donc:

classe HomeViewController : FilterDelegate ... {

func updateTable() { 
/* GET THE DATA FILTERED HERE */ 
tableview.reloadData() 
} 

Dans votre FilterViewController:

@IBAction func returnHome(_ sender: Any) { 
     let vc = self.storyboard!.instantiateViewController(withIdentifier: "home") as! HomeViewController 
     self.delegate = vc 
     self.present(vc, animated: false, completion: nil) 
     delegate?.updateTable() 
    } 

Je pense que cela devrait fonctionner.

EDIT:

Une autre approche consiste à créer un enchaînement entre ces deux VCS et qui passe les filtres sont actifs en utilisant la fonction « préparer ». Ensuite, vous pouvez prendre cette information dans votre HomeVC et charger votre table en fonction des filtres de la fonction viewDidLoad.

1 - Création d'un objet Filtres:

class Filters { 
     var tuxtlaSwitchIsOn: Bool 
     var sevillaSwitchIsOn: Bool 
     ... 
     init(tuxtlaSwitchIsOn: Bool, sevillaSwitchIsOn: Bool, ...) { 
      self.tuxtlaSwitchIsOn = tuxtlaSwitchIsOn 
      self.sevillaSwitchIsOn = sevillaSwitchIsOn 
      ... 
     } 
} 

2 - Ajouter un Filtres attribut à votre HomeVC

class HomeViewController : ... { 
... 
var filtersActive: Filters? 
... 
} 

3 - Dans votre FilterViewController instancier un objet de filtre indiquant que les filtres sont sur

4 - Dans votre FilterViewController, préparer les funs passer l'objet Filtre à HomeVC

5 - Dans votre HomeVC, récupérez l'objet Filtre et filtrez vos données en fonction de celui-ci.

+0

Merci beaucoup, c'est une meilleure façon d'échanger des données d'un VC à l'autre! ;) –

+0

Oh merci beaucoup pour votre dernière contribution, ça m'aide beaucoup, maintenant j'ai ma solution complète! : D –

1

Bien sûr, voici ce dont vous avez besoin. Donc, vous avez un ensemble de tableau rempli de données et vous souhaitez appliquer un filtre sur eux. D'abord, vous devez créer un autre tableau pour les résultats du filtre. C'est parce que lorsque l'utilisateur supprime le filtre, vous voulez toujours afficher la liste complète. Pour simplifier, disons que vous avez seulement un tableau Foo: [String]. Vous devez donc créer un autre tableau appelé FooFiltered: [String] pour contenir le résultat de la recherche. Vous pouvez le laisser vide lorsque le contrôleur de vue est chargé.

Ensuite, dans votre section de filtre, il est recommandé d'utiliser la technologie de filtre de matrice comme this post, mais ce n'est pas grave si vous voulez le faire sur votre chemin. Donc tout ce que vous devez faire est d'obtenir des éléments du tableau Foo qui correspondent à certains critères et les copier dans le tableau FooFiltered. Ici, laissez-moi vous montrer un exemple de faire un filtre manuellement

func filter() { 
    FooFiltered = [String]() //Clean up every time before search 
    for str in Foo { 
     if str == "criteria" { 
      FooFiltered.append(str) 
     } 
    } 
} 

Maintenant, vous avez une liste d'éléments filtrés. Vous avez besoin d'un indicateur pour indiquer à la vue de la table quel ensemble de tableau afficher. Supposons que vous ayez un drapeau appelé showSearchResult qui a la valeur false à l'origine. Lorsque vous effectuez le filtre, définissez-le sur true. Ainsi, votre cellForRow ressemblera

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if showSearchResult { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! Cell 

     cell.textField.text = FooFiltered[indexPath.row] 

     return cell 
    } else { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! Cell 

     cell.textField.text = Foo[indexPath.row] 

     return cell 
    } 
} 

Vous devez également mettre à jour ce drapeau à toute votre méthode déléguée vue de la table, comme numberOfRowsInSection, etc.

Enfin, avec ces codes, votre point de vue de table est configuré pour afficher les résultats complets ou les résultats filtrés sont basés sur le drapeau et vous définissez ce drapeau dans la fonction filter(). La dernière chose à faire est de demander à tableView de recharger les données lorsque le filtre est terminé. Donc, modifiez votre fonction de filtre comme ceci et vous devriez être tous ensemble.

func filter() { 
    FooFiltered = [String]() //Clean up every time before search 
    showSearchResul = true 
    for str in Foo { 
     if str == "criteria" { 
      FooFiltered.append(str) 
     } 
    } 
    self.tableView.reloadData() 
} 
+0

Merci beaucoup pour votre explication, c'était si clair et utile! J'apprécie vraiment cela! : D –

+1

@ZitaNoriegaEstrada Pas de problème, codage heureux :) –