0

I have a TableView with two kind of Cells, both are filled with a CollectionView. In the TableViewController I let them them display with a simple if Statement.

My TableViewController:

import UIKit
import RealmSwift
import Alamofire
import SwiftyJSON

let myGroupLive = DispatchGroup()
let myGroupCommunity = DispatchGroup() 

class HomeVTwoTableViewController: UITableViewController {

var headers = ["Live", "Channel1", "ChannelTwo", "Channel3", "Channel4", "Channel5", "Channel6"]

override func viewDidLoad() {
    super.viewDidLoad()
    DataController().fetchSomeDate(mode: "get")
    DataController().fetchSomeOtherData(mode: "get")
}
//MARK: Custom Tableview Headers
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return headers[section]
}

override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int){

    view.tintColor = UIColor.black
    let header = view as! UITableViewHeaderFooterView
    if section == 0 {
        header.textLabel?.textColor = UIColor.black
        view.tintColor = UIColor.white
    }
    else {
        view.tintColor = UIColor.groupTableViewBackground
    }
}

//MARK: DataSource Methods
override func numberOfSections(in tableView: UITableView) -> Int {
    return headers.count
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

//Choosing the responsible PrototypCell for the Sections
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellBig", for: indexPath) as! HomeVTwoTableViewCell

        return cell
    }
    else if indexPath.section == 1 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellSmall", for: indexPath) as! HomeVTwoTableViewCellSmall

        return cell
    }

    else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellSmall", for: indexPath) as! HomeVTwoTableViewCellSmall

        return cell
    }
}

//Set custom cell height, has to match the CollectionView height
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {

    if indexPath.section == 0 {
        return 225.0
    }
    else {
        return 120.0
    }
  }
}

My TableViewCellSmall:

import UIKit
import RealmSwift

var communities: Results<Community>?

class HomeVTwoTableViewCellSmall: UITableViewCell{

@IBOutlet weak var collectionView: UICollectionView!
}

extension HomeVTwoTableViewCellSmall: UICollectionViewDataSource,UICollectionViewDelegate {

//MARK: Datasource Methods
func numberOfSections(in collectionView: UICollectionView) -> Int
{
    return 1
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
    return (communities?.count)!
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
    guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCellSmall", for: indexPath) as? HomeVTwoCollectionViewCellSmall else
    {
        fatalError("Cell has wrong type")
    }

//Here I want my Sorting Statement to make unique content per collection view
    //normal approach if no section is asked
    let url : String = (communities?[indexPath.row].pictureUri)!
    let name :String = (communities?[indexPath.row].communityName)!
    cell.titleLbl.text = name
    cell.imageView.downloadedFrom(link :"somelink")

    return cell
}


//MARK: Delegate Methods  
override func layoutSubviews() {
    myGroupCommunity.notify(queue: DispatchQueue.main, execute: {
        let realm = try! Realm()
        communities = realm.objects(Community.self)
        self.collectionView.dataSource = self
        self.collectionView.delegate   = self
    })

}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
do something
 }
}

My Problem is now, I want the "Channel Cells" to fill with customized and different data, in the CollectionView. That means I need some sort of key to get the right data in the right cell. My approach would be to take the SectionHeader Title, but for some reasons I cant access it from the TableViewCellSmall. So I have all the data in all the Cells and cant sort them without my Key.

Thanks in Advance.

Aravind A R
  • 2,674
  • 1
  • 15
  • 25
Lukas
  • 29
  • 8

1 Answers1

0

from what I understand you need to fill the collectionview of each cell with different contents and for this needs to identify the cell?

If so, I used the method below that helped me, you can try.

If in doubt let me know so I can help, I hope I have helped :)

//TableViewCell Add

var didCollectionViewCellSelect: ((Int) -> Void)?

override func setSelected(_ selected: Bool, animated: Bool)
    {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }


//TabelView Add
class myClass: UITableViewController
{
    var storedOffsets = [Int: CGFloat]()

    override func viewDidLoad()
    {
        super.viewDidLoad()

    }

  override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
  {
        guard let tableViewCell = cell as? myTableViewCell else { return }

        let secao = indexPath.section*1000 //Section
        let linha = indexPath.row //Row
        let posicao = secao+linha

        tableViewCell.setCollectionViewDataSourceDelegate(self, forRow: posicao)
        tableViewCell.collectionViewOffset = storedOffsets[posicao] ?? 0
  }

  override func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath)
  {
    guard let tableViewCell = cell as? myTableViewCell else { return }

    let secao = indexPath.section*1000 //Section
    let linha = indexPath.row //Row
    let posicao = secao+linha 

    storedOffsets[posicao] = tableViewCell.collectionViewOffset

  }

}       

//CollectionView        

  func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
  {
    let posicao = collectionView.tag
    let secao = Int(collectionView.tag/1000) //Section
    let linha = posicao-(secao*1000) //Row

    var qtd = 0

    if secao == 0 && arrStation.count > 0
    {
        qtd = arrStation.count
    }

    return qtd
  }
cwilliamsz
  • 718
  • 9
  • 20
  • Thanks for responding. This helped a little but I think my question was written badly. The Problem is that I need the section header from the TableCells, to fill in my data in the CollectionViews (as an Identifier). I solved it with a global variable. But I think thats a pretty bad practice. I'm not sure if your Code would solve this problem. – Lukas Jun 26 '17 at 07:23