从 UITableViewCell 快速获取 TableView 部分标题

Posted

技术标签:

【中文标题】从 UITableViewCell 快速获取 TableView 部分标题【英文标题】:Getting the TableView Section Title from TableViewCell, swift 【发布时间】:2017-06-16 07:23:56 【问题描述】:

我有一个带有两种单元格的TableView,两者都充满了CollectionView。在TableViewController 中,我让它们用一个简单的 if 语句显示。

我的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
    
  

我的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
 

我现在的问题是,我希望“通道单元”在CollectionView 中填充自定义和不同的数据。这意味着我需要某种密钥才能在正确的单元格中获取正确的数据。我的方法是使用 SectionHeader Title,但由于某些原因,我无法从 TableViewCellSmall 访问它。所以我拥有所有单元格中的所有数据,没有我的密钥就无法对它们进行排序。

提前致谢。

【问题讨论】:

【参考方案1】:

据我了解,您需要用不同的内容填充每个单元格的集合视图,为此需要识别单元格?

如果是这样,我用了下面对我有帮助的方法,你可以试试。

如果有疑问,请告诉我,以便我可以提供帮助,希望我有所帮助:)

//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
  

【讨论】:

感谢您的回复。这有点帮助,但我认为我的问题写得不好。问题是我需要 TableCells 中的部分标题来在 CollectionViews 中填写我的数据(作为标识符)。我用一个全局变量解决了它。但我认为这是一个非常糟糕的做法。我不确定你的代码是否能解决这个问题。

以上是关于从 UITableViewCell 快速获取 TableView 部分标题的主要内容,如果未能解决你的问题,请参考以下文章

获取当前显示的UITableViewCell

内部带有TextView的快速自定义UITableViewCell消失

自定义 UITableViewCell 未正确加载

如何从 UITableViewCell 中获取价值

从 uitableviewcell 获取文本输入

如何从自定义 UITableViewCell 获取值到 ViewController?