2017-05-25 1 views
-1

J'essaye de mettre deux CollectionViews dans un Viewcontroller. J'ai essayé beaucoup de solutions, mais chaque fois que les données montrent seulement dans le premier CollectionsView. Les données que je veux mettre dans les deux CollectionView sont les mêmes.Deux CollectionViews dans un Viewcontroller

Comment puis-je faire

Mon code

import UIKit 
import Firebase 
import MobileCoreServices 
import AVKit 

private let reuseIdentifier = "Cell" 

var databaseRefRoom: FIRDatabaseReference { 
    return FIRDatabase.database().reference() 
    } 

class RoomViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UITableViewDelegate { 

    //ScrollView 
    @IBOutlet weak var favoritesBtn: UIButton! 
    @IBOutlet weak var yourChatBtn: UIButton! 
    @IBOutlet weak var mostPopularBtn: UIButton! 

    //RoomCollectionView -> RoomViewCollectionViewCell 
    var rooms = [Room]() 
    @IBOutlet weak var collectionView: UICollectionView! 



    //RoomViewController material 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.title = "Chuloo" 

     self.navigationController?.isNavigationBarHidden = false 

     favoritesBtn.setTitle("Favorites", for:.normal) 
     favoritesBtn.titleLabel?.textColor = UIColor.white 
     favoritesBtn.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Bold", size: 14) 
     favoritesBtn.backgroundColor = UIColor.orange 

     yourChatBtn.setTitle("Your Chat", for:.normal) 
     yourChatBtn.titleLabel?.textColor = UIColor.white 
     yourChatBtn.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Bold", size: 14) 
     yourChatBtn.backgroundColor = UIColor.red 

     mostPopularBtn.setTitle("Most Popular", for:.normal) 
     mostPopularBtn.titleLabel?.textColor = UIColor.white 
     mostPopularBtn.titleLabel?.font = UIFont(name: "AppleSDGothicNeo-Bold", size: 14) 
     mostPopularBtn.backgroundColor = UIColor.blue 


     //RoomCollectionView -> Display CollectionView i ScrollView -> Extension 
     collectionView.dataSource = self 
     collectionView.delegate = self 

     let date = Date() 
     let formatter = DateFormatter() 
     formatter.dateFormat = "dd.MMMM.yyyy - hh:mm:ss a" 
     formatter.amSymbol = "AM" 
     formatter.pmSymbol = "PM" 
     let result = formatter.string(from: date) 

     //Hide backButton 
     self.navigationItem.setHidesBackButton(true, animated: false) 

     //RoomCollectionView -> DataService fetch from Server 
     DataService.dataService.fetchDataFromServer { (room) in 
      self.rooms.append(room) 
      let indexPath = IndexPath(item: self.rooms.count - 1, section: 0) 
      self.collectionView?.insertItems(at: [indexPath]) 
      } 

     //Online User Status 
     let usersRef = databaseRefRoom.child("online") 
     let currentUserRef = usersRef.child((FIRAuth.auth()?.currentUser?.displayName)!) 
     currentUserRef.setValue("online") 
     currentUserRef.onDisconnectRemoveValue() 

     //Database User child Online Status 
     let usersRefUser = databaseRefRoom.child("users").child((FIRAuth.auth()?.currentUser?.displayName)!).child("Online Status").child("online") 
     usersRefUser.setValue(result) 

     let usersRefOffline = databaseRefRoom.child("users").child((FIRAuth.auth()?.currentUser?.displayName)!).child("Online Status") 
     usersRefOffline.onDisconnectUpdateChildValues(["offline": result]) 


    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 

    } 
} 

//RoomCollectionView -> Display 
extension RoomViewController { 

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return rooms.count 

    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "roomCell", for: indexPath) as! RoomViewCollectionViewCell 

     let room = rooms[indexPath.row] 

     cell.layer.cornerRadius = 4 
     cell.layer.borderColor = UIColor(red: 248.0/255.0, green: 248.0/255.0, blue: 248.0/255.0, alpha: 1.0).cgColor 
     cell.layer.borderWidth = 1 
     cell.layer.shadowColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.25).cgColor 
     cell.layer.shadowOffset = CGSize(width: 0, height: 2) 
     cell.layer.shadowOpacity = 0.5 
     cell.layer.shadowRadius = 1.0 
     cell.layer.masksToBounds = false 

     // Configure the cell 
     cell.configureCell(room: room) 
     return cell 
    } 

    func collectionView(collectionView: UICollectionView, layout: UICollectionViewLayout, sizeForItemAt: IndexPath) -> CGSize { 
     return CGSize(width: view.frame.width/2 - 5, height: view.frame.width/2 - 5) 

    } 

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

    } 


} 
+0

Vous ne faites qu'une seule collectionVoir en tant que 'IBOutlet', qu'en est-il du second? il devrait également être connecté au contrôleur de vue en tant que 'IBOutlet' ... –

+0

Votre code n'affiche pas deux vues de collection. – David

+0

J'ai effacé la deuxième collectionVoir dans le code ci-dessus, parce que j'ai besoin d'aide pour mettre en œuvre la seconde –

Répondre

0

Parcourons ce qui est le problème de votre code et comment vous pouvez le résoudre.

Première:

Vous avez dit que:

je essaie de mettre deux CollectionViews dans un viewController.

mais votre code ne semble pas contenir deux vues de collection. Donc, ce que vous devez faire est:

class ViewController: UIViewController { 
    . 
    . 
    . 

    @IBOutlet weak var collectionView1: UICollectionView! 
    @IBOutlet weak var collectionView2: UICollectionView! 

    . 
    . 
    . 
} 

Assurez-vous de connecter les deux vues de collection au contrôleur de vue.

Deuxième:

J'ai essayé de nombreuses solutions, mais chaque fois que les données montrent que dans le premier CollectionsView. Les données que je veux mettre dans les deux CollectionView est la même.

Assurez-vous -après la mise en œuvre du premier beau-est de se conformer à les deux vues de collectedataSource et delegate:

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 
    . 
    . 
    . 

    @IBOutlet weak var collectionView1: UICollectionView! 
    @IBOutlet weak var collectionView2: UICollectionView! 

    override func viewDidLoad() { 
     . 
     . 
     . 

     collectionView1.dataSource = self 
     collectionView1.delegate = self 
     collectionView2.dataSource = self 
     collectionView2.delegate = self 

     . 
     . 
     . 
    } 

    . 
    . 
    . 
} 

Ne plus afficher devraient conduit à obtenir exigence de « Je veux mettre dans les deux CollectionView est le même".

également

Que faire si vous devez laisser chacun la vue de la collecte de lire à partir d'une source de données? vous pouvez laisser la méthode dateSource/délégué à reconnaître la vue de collection en définissant une tag, comme suit:

Dans la méthode viewDidLoad():

// setting tags: 
collectionView1.tag = 101 
collectionView2.tag = 102 

Ainsi:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return collectionView === collectionView1 ? dataSource1.count : dataSource2.count 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CellID", for: indexPath) 

    let currentObject = collectionView === collectionView1 ? dataSource1[indexPath.row] : dataSource2[indexPath.row] 

    . 
    . 
    . 

    return cell 
} 

Et sur ...

J'espère que cela a aidé.

+0

Merci, je l'ai fait dans la première tentative. Je viens de trouver le problème. Mais merci quand même –

+0

@ CarstenHøvsgaard Content de vous aider. Btw, permettez-moi de vous noter que j'ai vérifié votre profil et remarqué que vous n'acceptez pas de réponses; Accepter les réponses conduit à: vous donne +2 points, donne au répondeur +15 points et le plus important est que cela donne une indication aux téléspectateurs que cette réponse est la bonne pour cette question. Cela ne veut pas dire que ma réponse est acceptable pour votre question, mais je pense que ce serait pour vous rappeler d'accepter des réponses :) –