2017-12-02 275 views
1

我在一個collectionView中放置了一個tableView並添加了代表。問題是,我想控制collectionView中不同tableView中的數據。UITollectionView中的UITableView

每個collectionView都有一個標籤,其中包含當天的名稱(例如:「Monday」)。標籤下面是一個tableView。在tableView中應根據collectionView的索引顯示不同的數據。

在我的例子中,每個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! 
} 

image 1:在這裏你可以看到的CollectionView第一的tableView(的CollectionView的第一項)

image 2:在這裏你可以看到第二的tableView在的CollectionView(的CollectionView的第二項)

image 3:故事板

image 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! 
} 
+2

爲什麼要在每個單元格中放置一個表格視圖,如果表格視圖只有兩行?爲什麼不直接向收藏夾視圖單元添加兩個標籤? – rmaddy

+0

分享您想要設計的屏幕截圖。之後,我可以幫助你。 – iDev750

+0

@rmaddy:因爲用戶可以更改行數。這只是樣本數據。事實上,每桌有11行的可能性更大。 – Adrian1304

回答

0

您可以在表格單元格添加表委託方法 級,然後您可以設置一天的數據。所以每個收集單元都有自己的表格和自己的數據。

是這樣的:從您的CollectionView的外細胞在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 
} 
+0

首先:感謝您的幫助!但我不確定第二個代碼(public func ...)必須放在哪裏。你能否提供一些額外的信息?我用公共函數替換了「StundenplanCollectionViewController」中的「cellForItemAt」函數。但Xcode說:「使用未解析的標識符'tableView'」。 – Adrian1304

+0

不客氣。好的,答案已經有所改善了。希望這可以幫助。 – missionMan

+0

這對我來說確實使一些事情更清晰。非常感謝!但畢竟我仍然無法以正確的方式實現您的代碼。我更新了我的代碼,按照你的提示,我將它添加到問題中。如果你可以再看看代碼,那將是非常好的。我只是沒有得到**如何訪問ViewController **(StundenplanCollectionViewController)內的tableView。 – Adrian1304

0

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 { 
     ... 
    } 

     ... 

組數據你爲什麼從UITableView試圖dequeue一個UICollectionViewCell

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

是的,你是對的,這是更新代碼的唯一問題。現在它工作了!謝謝。 – Adrian1304