【问题标题】:Two CollectionViews in One Viewcontroller一个 ViewController 中的两个 CollectionView
【发布时间】:2017-05-25 19:08:16
【问题描述】:

我正在尝试将两个 CollectionViews 放在一个 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) {

    }


}

【问题讨论】:

  • 您只制作了一个collectionView 作为IBOutlet,那么第二个呢?它还应该以IBOutlet...的形式连接到视图控制器...
  • 您的代码没有显示两个集合视图。
  • 我已经删除了上面代码中的第二个collectionView,因为我需要帮助来实现第二个

标签: swift uiviewcontroller uicollectionview


【解决方案1】:

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

第一:

你提到过:

我正在尝试将两个 CollectionViews 放在一个 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是一样的”的要求。

还有

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

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
}

等等……

希望这会有所帮助。

【讨论】:

  • 谢谢,我第一次尝试就做到了。我刚刚发现了问题。不过还是谢谢
  • @CarstenHøvsgaard 很高兴为您提供帮助。顺便说一句,请允许我提醒您,我检查了您的个人资料并注意到您不接受答案;接受答案会导致:给你+2分,给回答者+15分,最重要的是它向观众表明这个答案是这个问题的正确答案。这并不意味着我的回答是您的问题可以接受的答案,但我认为这会提醒您接受答案:)
猜你喜欢
  • 1970-01-01
  • 2020-10-16
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 2016-07-26
  • 1970-01-01
相关资源
最近更新 更多