簡體   English   中英

UICollectionView中的UITableView

[英]UITableView in UICollectionView

我將tableView放在collectionView並添加了委托。 問題是,我想控制collectionView不同tableViews中的數據。

每個collectionView都有一個帶有當天名稱的標簽(例如:“ Monday”)。 標簽下方是tableView 根據collectionView的索引,應該在tableView中顯示不同的數據。

在我的示例中,每個tableView都有兩個單元格。 collectionView第一項中的tableView應該顯示: cell1: "1"cell2: "2" ,第二項中的tableView應該顯示: cell1: "3"cell2: "4"

我目前正在使用以下代碼:

    import UIKit

class StundenplanCollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UITableViewDataSource, UITableViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        myHours.append(myH0)
        myHours.append(myH1)
        myHours.append(myH2)
        myHours.append(myH3)
        myHours.append(myH4)
        myHours.append(myH5)

        collectionView.delegate = self
        collectionView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //MARK: Outlets
    @IBOutlet weak var collectionView: UICollectionView!

    //MARK: Variables
    var myDays = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"]
    var myHours: [[String]] = Array() //Array that holds myH1 - myH5
    var myH0 = ["1", "2"]
    var myH1 = ["3", "4"]
    var myH2 = ["5", "6"]
    var myH3 = ["7", "8"]
    var myH4 = ["9", "10"]
    var myH5 = ["Error", "Error"]

    var tableLoop = 0

    var headerColor: UIColor = UIColor( red: CGFloat(255/255.0), green: CGFloat(140/255.0), blue: CGFloat(60/255.0), alpha: CGFloat(1.0))


    //MARK: Table and Collection View
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return myDays.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell: StundenplanCollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: "stundenplanCollectionCell", for: indexPath) as! StundenplanCollectionViewCell
        cell.titleLabel.text = myDays[indexPath.row]
        cell.titleLabel.backgroundColor = headerColor
        cell.titleLabel.textColor = UIColor.white
        return cell
    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return myHours[tableLoop].count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: StundenplanTableViewCell = tableView.dequeueReusableCell(withIdentifier: "stundenplanTableCell", for: indexPath) as! StundenplanTableViewCell
        cell.titleLabel.text = myHours[/*Here should the indexPath.row of the collectionView item be placed*/][indexPath.row]
        return cell
    }
}

class StundenplanCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var tableView: UITableView!
}

class StundenplanTableViewCell: UITableViewCell {
    @IBOutlet weak var titleLabel: UILabel!
}

圖1:在這里你可以看到第一個tableViewcollectionView (第一項collectionView ):

圖片1

圖像2:在這里您可以看到collectionView中的第二個tableView(collectionView的第二個項目):

圖片2

圖片3:情節提要:

圖片3

圖4:視圖中不同對象的結構:

圖片4

更新的代碼 (根據@missionMan的回答-謝謝!):

import UIKit

class StundenplanCollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationController?.navigationBar.prefersLargeTitles = false
        navigationController?.navigationBar.prefersLargeTitles = true
        navigationItem.largeTitleDisplayMode = .always

        myHours.append(myH0)
        myHours.append(myH1)
        myHours.append(myH2)
        myHours.append(myH3)
        myHours.append(myH4)
        myHours.append(myH5)

        collectionView.delegate = self
        collectionView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //MARK: Outlets
    @IBOutlet weak var collectionView: UICollectionView!

    //MARK: Variables
    var myDays = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"]
    var myHours: [[String]] = Array() //Array that holds myH1 - myH5
    var myH0 = ["1", "2"]
    var myH1 = ["3", "4"]
    var myH2 = ["5", "6"]
    var myH3 = ["7", "8"]
    var myH4 = ["9", "10"]
    var myH5 = ["Error", "Error"]

    var headerColor: UIColor = UIColor( red: CGFloat(255/255.0), green: CGFloat(140/255.0), blue: CGFloat(60/255.0), alpha: CGFloat(1.0))


    //MARK: Table and Collection View
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return myDays.count
    }

    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "stundenplanCollectionViewCell") as? StundenplanCollectionViewCell else { //how can I access the inner tableView? Error: Use of unresolved identifier 'tableView'
            return UICollectionViewCell()
        }

        //set data and reload inner table from outer view controller (StundenplanCollectionViewController according to your code)
        cell.dayItems = myHours[indexPath.row]
        cell.tableView.reloadData()
        //...

        return cell
    }


class StundenplanCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var tableView: UITableView!
    var dayItems: [String] = []

    override func awakeFromNib() {
        super.awakeFromNib()
        self.tableView.delegate = self    // <-- set delegates inner table
        self.tableView.dataSource = self
    }
}

extension StundenplanCollectionViewCell: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dayItems.count
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 100
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: StundenplanTableViewCell = (tableView.dequeueReusableCell(withIdentifier: "stundenplanTableViewCell") as? StundenplanTableViewCell)!
        //...
        return cell
    }
}

class StundenplanTableViewCell: UITableViewCell {
    @IBOutlet weak var titleLabel: UILabel!
}

您可以在表單元格類中添加表委托方法,然后可以設置一天的數據。 因此,每個收集單元將具有自己的表和數據。

像這樣:

class StundenplanCollectionViewCell: UICollectionViewCell { //<-- outer cell
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var innerTableView: UITableView! //<-- declare inner table
    var dayItems: [String] = []

    override func awakeFromNib() {
        super.awakeFromNib()
        self.innerTableView.delegate = self    // <-- set delegates inner table
        self.innerTableView.dataSource = self
    }
}

extension StundenplanCollectionViewCell: UITableViewDataSource, UITableViewDelegate {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dayItems.count
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        ...
    }

        ...

StundenplanCollectionViewController從collectionView的外部單元格設置數據

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let cell = collectionView.dequeueReusableCell(withIdentifier: "stundenplanCollectionViewCell") as? StundenplanCollectionViewCell else { //<-- HERE
        return UICollectionViewCell()
    }

    //set data and reload inner table from outer view controller (StundenplanCollectionViewController according to your code)
    cell.dayItems = myH[indexPath.row]
    cell.innerTableView.reloadData()
    ...

    return cell
}

為什么要嘗試從UITableView dequeue UICollectionViewCell

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)
   ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM