从 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 部分标题的主要内容,如果未能解决你的问题,请参考以下文章