2017-06-08 3 views
0

J'ai un UICollectionView dans un UITableViewCell. Vous pouvez consulter l'image au hereSwift 3 - Recharger UICollectionView dans la UITableViewCell

Je voudrais recharger la CollectionView si une mise à jour arrive.

Je l'ai fait quelques recherches et trouvé ceci:

  1. how to reload a collectionview that is inside a tableviewcell
  2. Reloading collection view inside a table view cell happens after all cells in table view have been loaded
  3. UICollectionView not updating inside UITableViewCell

J'ai appelé le @IBOutlet weak var collectionView: UICollectionView!UITableViewCell-UITableViewController à cellForRowAt.

Voici le code:

var refreshNow: Bool = false 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.allCardCell, for: indexPath) as! AllCardTableViewCell 

     if refreshNow { 
      cell.collectionView.reloadData() 
      refreshNow = false 
     } 

     cell.collectionView.collectionViewLayout.invalidateLayout() 
     return cell 
    } 

Si l'utilisateur clique sur Ok UIAlertAction:

let alert = UIAlertController(title: "Success", message: "Card successfully added", preferredStyle: .alert) 
       let action = UIAlertAction(title: "Ok", style: .default) { (action) in 
        self.refreshNow = true 
        self.tableView.reloadData() 
       } 
       alert.addAction(action) 
       self.present(alert, animated: true, completion: nil) 

La raison pour laquelle je mets le refreshNow est d'empêcher les applications de retard et lent. Mais n'a toujours pas mis à jour si des changements se produisent.

Le problème est le CollectionView n'a pas rafraîchir. Mais quand j'ai débogué, il a été passé par le cell.collectionView.reloadData().

La mise à jour/changements se produisent que lorsque je redémarre les applications. Je veux qu'il soit appelé real-times mise à jour.

Toute aide est vraiment apprécié et merci beaucoup.

Crédit: How to use StoryBoard quick build a collectionView inside UITableViewCell

+0

essayez d'appeler des données de rechargement sur le thread principal en utilisant la file d'attente de répartition. –

+0

@TusharSharma quelle partie? à 'cellForRowAt'? – Sariyanti

+0

oui appelez une file d'attente d'expédition là-bas et à l'intérieur de celle-ci appelez la ligne de données de rechargement. –

Répondre

-1

Dans votre cas, vous devez affecter tag à votre vue collection afin d'obtenir l'accès en dehors de la fonction cellForRowAt.

Voici comment votre fonction devrait ressembler à:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: Storyboard.allCardCell, for: indexPath) as! AllCardTableViewCell 

    cell.collectionView.tag = 1234 
    return cell 
} 

et l'action recharger accédera au CollectionView en utilisant la balise

let action = UIAlertAction(title: "Ok", style: .default) { (action) in 
    let collectionView = self.tableView.viewWithTag(1234) as! UICollectionView 
    collectionView.reloadData() 
} 

prendre note également que cellForRowAt gardera reload la contenu basé sur ce que vous avez ajouté à l'intérieur chaque fois que la cellule apparaît. Alors, continuez à mettre à jour vos données en dehors de la fonction cellForRowAt.

+0

Il n'a pas mis à jour. Rien n'arrive. – Sariyanti

+0

J'ai contrôleur de vue de table que l'une des cellules a la collection voir ce code va planter à laisser collectionView = self.tableView.viewWithTag (1234) comme! UICollectionView –

0

Parce que vous UITableViewCell donc vous réutilisé doit alway recharger votre UICollectionView. Si vous utilisez refreshNow pour recharger UICollectionView, à la cellule ont refreshNow = false, UICollectionView affiche comme cellule qu'il est réutilisé => mauvais enter image description here

représentant udate:

Voir en image UITableViewCell 1 réutilisera à l'index 6.Si vous ne rechargez pas le contenu de la cellule (reload collectionview), il affichera comme uitableviewcell 1 à l'index 0

+0

Je ne t'ai pas eu. Pourriez-vous s'il vous plaît plus spécifique? – Sariyanti