UICollectionView中的UITableView [英] UITableView in UICollectionView

查看:70
本文介绍了UICollectionView中的UITableView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在 collectionView 内放置了 tableView 并添加了代表。问题是,我想控制 collectionView 中不同的 tableViews 中的数据。

I placed a tableView inside a collectionView and added the delegates. The problem is, that I want to control the data in the different tableViews in the collectionView.

每个 collectionView 都有一个带有当前日期名称的标签(例如:星期一)。标签下方是 tableView 。根据 collectionView 的索引,在 tableView 中应显示不同的数据。

Every collectionView holds a label with the name of the current day (e.g.: "Monday"). Below the label is a tableView. In the tableView should be displayed different data, based on the index of the collectionView.

在我的示例中,每个 tableView 都有两个单元格。 collectionView 的第一项中的 tableView 应该显示: cell1: 1 cell2: 2 ,第二项中的 tableView 应显示: cell1: 3 cell2: 4

In my example, every tableView has two cells. The tableView in the first item of the collectionView should display: cell1: "1" and cell2: "2", the tableView in the second item should display: cell1: "3" and 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: collectionView 中的 tableView collectionView 的第一项):

Image 1: Here you can see the first tableView in the collectionView (first item of collectionView):

图片2:在这里,您可以看到collectionView中的第二个tableView(collectionView的第二个项目):

Image 2: Here you can see the second tableView in the collectionView (second Item of collectionView):

图片3:故事板:

图片4:视图中不同对象的结构:

Image 4: Structure of the different objects in the view:

更新后的代码(根据@missionMan的回答-谢谢!):

Updated code (according to the answer by @missionMan - Thanks by the way!):

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!
}


推荐答案

您可以添加表委托方法在表单元格类
中,则可以设置一天的数据。因此,每个收集单元将具有自己的表和数据。

You can add table delegate methods in table cell class and then you can set data for one day. So each collection cell will have its own table and its own data.

像这样:

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

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
}

这篇关于UICollectionView中的UITableView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆