2017-08-02 6 views
0

J'ai un tableau de NSObjects que j'ai besoin de lire dans un autre viewcontroller. Cependant, je ne sais pas quel niveau je devrais mettre les données pour cela. Cette capture d'écran ci-dessous explique mieux ce que j'essaie de faire. Chaque HomeController possède un titre, une liste de membres, une description et un encart collection (barre jaune). J'ai besoin des vues de collection nombre de cellules pour égaler le nombre de membres. screenshotAccès à un tableau dans un autre contrôleur de vue

J'ai essayé de créer une référence à HomeController à l'intérieur du CollectionView encart en utilisant var paresseux, mais qui a obtenu l'erreur: fatal error: Index out of range

lazy var homeController: HomeController = { 
    let hc = HomeController() 
    hc.liveCell = self 
    return hc 
}() 

Encore une fois cela se fait à l'intérieur du CollectionView encart

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath : 
    IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: profileImageCellId, for: indexPath) as! profileImageCell 

    let room = homeController.rooms[indexPath.row] 

    print(room.members?.count) 

    return cell 

} 

Des suggestions?

EDIT

Les données sont ajoutées au tableau en utilisant cette fonction

var rooms = [Room]() 

func fetchAllRooms(){ 
    Database.database().reference().child("rooms").observe(.childAdded, with: { (snapshot) in 

     if let dictionary = snapshot.value as? [String: AnyObject] { 
      let room = Room() 

      room.rid = snapshot.key 
      room.setValuesForKeys(dictionary) 

      self.rooms.append(room) 
      print(snapshot) 

      DispatchQueue.main.async(execute: { 
       self.collectionView?.reloadData() 
      }) 
     } 


     print("end of room snap") 

    }, withCancel: nil) 
} 

Voici la cellule pour l'élément à chemin d'index au niveau HomeController

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    var cell = UICollectionViewCell() 
    let section = indexPath.section 

    let liveCell = collectionView.dequeueReusableCell(withReuseIdentifier: LiveCellId, for: indexPath) as! LiveCell 

     let cell = liveCell 

     let room = rooms[indexPath.row] 

     liveCell.liveStreamNameLabel.text = room.groupChatName 
     liveCell.descriptionLabel.text = room.groupChatDescription 

     return cell 
} 
+0

' Laissez hc = HomeController() 'crée une nouvelle instance d'un HomeController. Peut-être que ce n'est pas ce que tu visais? Il ne vous donnera pas l'objet HomeController actuel. Donc, cela dépend vraiment de la façon dont vous créez le tableau des chambres. – ryantxr

+0

@ryantxr qui a du sens. C'est probablement pourquoi j'ai eu l'erreur hors de l'index. Je vous remercie. – Stefan

Répondre

0

Vous devez vérifier le nombre de votre tableau afin d'éviter l'accident

if homeController.rooms.count > indexPath.row { 
    let room = homeController.rooms[indexPath.row] 
    print(room.members?.count) 
} 
+0

qu'est-ce que cela fait exactement? – Stefan

+0

Juste pour éviter votre crash –

0

Pouvez-vous Debug et partager ci-dessous deux choses, alors nous pouvons regarder plus loin sur ce

  • Vérifiez ce qui est le chemin d'index que vous obtenez
  • Vérifiez si votre tableau ont des données
+0

En vérifiant 'let room = homeController.rooms [indexPath.row]' il y a deux index. Les deux retournent la valeur int de zéro. – Stefan

+0

Cela signifie que le tableau n'a aucune donnée. Donc maintenant la prochaine étape, nous devons vraiment déboguer comment tableau est initialisé dans HomeController. Comme vous créez une nouvelle instance ici pour obtenir les données de tableau. – Joe

+0

J'ai inclus la fonction qui crée le tableau dans une édition sur le poste – Stefan