一个Viewcontroller中的两个CollectionView

时间:2017-05-25 19:08:16

标签: swift uiviewcontroller uicollectionview

我试图将两个CollectionView放在一个Viewcontroller中。我尝试了很多解决方案,但每次数据只显示在第一个CollectionsView中。我想在两个CollectionView中放入的数据是相同的。

我该怎么做

我的代码

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) {

    }


}

1 个答案:

答案 0 :(得分:1)

让我们来看看代码的问题以及如何解决它。

<强>首先

你提到过:

  

我试图将两个CollectionView放在一个Viewcontroller中。

但您的代码似乎不包含两个集合视图。所以你应该做的是:

class ViewController: UIViewController {
    .
    .
    .

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

    .
    .
    .
}

确保将两个集合视图连接到视图控制器。

<强>第二

  

我尝试了很多解决方案,但每次只显示数据   第一个CollectionsView。我想要在CollectionView中放入的数据   是一样的。

确保 - 在实施第一步后 - 符合两个集合视图dataSourcedelegate

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

        .
        .
        .
    }

    .
    .
    .
}

这应该导致达到“我想要将两个CollectionView放在一起”的要求。

同时

如果您需要让每个集合视图从不同的数据源读取,该怎么办?你可以让dateSource / delegate方法通过设置 tag 来识别集合视图,如下所示:

viewDidLoad()方法中:

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

因此:

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
}

等等......

希望这会有所帮助。