如何从扩展的 collectionview 到达 tableview 的 indexpath.row?
Posted
技术标签:
【中文标题】如何从扩展的 collectionview 到达 tableview 的 indexpath.row?【英文标题】:How to reach indexpath.row of a tableview from extended collectionview? 【发布时间】:2019-08-23 12:28:41 【问题描述】:Junaid 在 2017 年添加了以下问题,我遇到了完全相同的问题,我 3 天都无法解决。
我正在开发一种调查类型的应用程序,其中我有一个问题、问题类型、发件人等要显示在 tableViw 单元格上,并且在里面我有一个水平的 collectionView,它将显示 Firebase 上同一节点的选项。
选项的数量因问题而异。
我相信如果你检查下面的代码并看到注释掉的行,你可能很容易解决它,但我无法管理它:(
另一个用户在 2017 年发布的问题。 "我正在尝试获取单元格类中 tableView 单元格的 indexPath。
我在表格视图单元格中有一个 collectionView,我正在尝试让 collectionView 单元格内的标签显示特定 collectionView 所在的 tableView 单元格的 indexPath.row。”
我试图获取 tableView 单元格的 indexpath.row 并在 collectionView itemAtRow 函数下实现它,但它不起作用。
class HomeTableViewController: UITableViewController
var surveyArray : [SurveyClass] = [SurveyClass]()
var ref: DatabaseReference?
var databaseHandle : DatabaseHandle?
let tableViewCellIdentifier = "HomeTableCell"
let collectionViewCellIdentifier = "HomeCollectionViewCell"
let tableViewHeaderNibName = "HomeTableViewHeaderView"
let tableViewHeaderIdentifier = "HomeTableViewHeader"
override func viewDidLoad()
super.viewDidLoad()
let headerNib = UINib(nibName: tableViewHeaderNibName, bundle: nil)
tableView.register(headerNib, forHeaderFooterViewReuseIdentifier: tableViewHeaderIdentifier)
retrieveSurveys()
// MARK: - UITableViewDataSource
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return surveyArray.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: tableViewCellIdentifier) as! HomeTableViewCell
cell.questionTextView.text = surveyArray[indexPath.row].question
cell.typeLabel.text = surveyArray[indexPath.row].type
cell.countLabel.text = surveyArray[indexPath.row].count
cell.senderLabel.text = surveyArray[indexPath.row].sender
cell.tableIndexPath = indexPath as NSIndexPath
return cell
override func numberOfSections(in tableView: UITableView) -> Int
return 1
func configureTableView ()
tableView.estimatedRowHeight = 316.0
tableView.sectionHeaderHeight = 45.0
tableView.sectionFooterHeight = 8.0
// MARK: - UITableViewDelegate
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
return 45
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
return 8
override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
let headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: tableViewHeaderIdentifier) as! HomeTableViewHeaderView
headerView.categoryLabel.text = "democrappy v1"
headerView.typeLabel.text = "Test"
return headerView
// MARK: - Retrieve Messages
func retrieveSurveys()
let surveysDB = Database.database().reference().child("surveys")
surveysDB.observe(.childAdded) (snapshot) in
let snapshotValue = snapshot.value as! Dictionary<String, String>
let question = snapshotValue["question"]!
let type = snapshotValue["type"]!
let count = snapshotValue["count"]!
let filled = snapshotValue["filled"]!
let sender = snapshotValue["sender"]!
let option1 = snapshotValue["option1"]!
let option2 = snapshotValue["option2"]!
let noOfOptions = snapshotValue["noOfOptions"]!
let surveyRetrieved = SurveyClass()
surveyRetrieved.question = question
surveyRetrieved.type = type
surveyRetrieved.count = count
surveyRetrieved.filled = filled
surveyRetrieved.sender = sender
surveyRetrieved.option1 = option1
surveyRetrieved.option2 = option2
surveyRetrieved.noOfOptions = noOfOptions
self.surveyArray.append(surveyRetrieved)
print(self.surveyArray)
self.configureTableView()
self.tableView.reloadData()
// MARK: - UICollectionViewDataSource
extension HomeTableViewController: UICollectionViewDataSource, UICollectionViewDelegate
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
print("Gokce \(indexPath.item)")
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return 5
// Doesnt work! Int((surveyArray[indexPath.row].noOfOptions)!) ?? 1
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionViewCellIdentifier, for: indexPath) as! HomeCollectionViewCell
cell.tag = indexPath.row
cell.tableIndexPath = indexPath as NSIndexPath
// doesnt work cell.optionLabel.text = [surveyArray[indexPath.row].option1, surveyArray[indexPath.row].option2][indexPath.item]
return cell
导入 UIKit
类 HomeTableViewCell: UITableViewCell
var tableIndexPath: NSIndexPath?
@IBOutlet weak var indexRowLabel: UILabel!
@IBOutlet weak var questionTextView: UITextView!
@IBOutlet weak var typeLabel: UILabel!
@IBOutlet weak var countLabel: UILabel!
@IBOutlet weak var senderLabel: UILabel!
@IBOutlet weak var collectionView: UICollectionView!
【问题讨论】:
同时显示您的HomeTableViewCell
。那里有tableIndexPath
(无需将其转换为NSIndexPath
)。只需将tableIndexPath.row
传递给collectionView 单元格。
感谢 Starsky 的帮助。下面我分享一下HomeTableViewCell
我不确定我是否理解您在做什么。你有一个 UITableViewController,你有它的数据源,但是你有一个用于处理 CollectionView 数据源的 UITableViewController 的扩展,但是你没有在这里声明一个 collectionView。我让你给我看HomeTableViewCell
中的代码。这是您在 tableView 中出列的单元格。在那个单元格内,我期待一个 collectionView,但不在同一个 UITableViewController 中。 P.S.:在 retrieveSurveys
中,您需要解析 json 并将其映射到 Survey
类型的对象中。
您好,Starsky。我编辑了代码,在底部你有 HomeTableViewCell。我尝试做的是让collectionView 成为tableview 的一部分,并显示一些我在retrieveSurveys 下附加到SurveyArray 的信息。这可能是一个简单的修复。问题是我还不是很能干。
首先,你不需要强制转换为 NSIndexPath。使用IndexPath
。其次,如果这就是你在HomeTableViewCell
中的全部内容,那么它是不正确的。您需要在该单元格内实现 CollectionViewDataSource。将所有代码从扩展移到 HomeTableViewCell:extension HomeTableViewCell: UICollectionViewDataSource, UICollectionViewDelegate
【参考方案1】:
HomeTableViewCell
有一个属性tableIndexPath
。此属性存储了您想要的信息,即tableViewCell
indexPath。
因此,在HomeTableViewCell
中,您必须将tableIndexPath
分配给集合视图的每个单元格,您必须传递HomeTableViewCell
的tableIndexPath
值。
您的错误是cell.tableIndexPath = indexPath as NSIndexPath
在collectionView 单元格中传递collectionView 委托函数的indexPath。
【讨论】:
亲爱的 Βασίλης Δ.,非常感谢。很抱歉再次问你,但我需要做什么才能将 tableIndexPath 传递给 collectionView? 而不是 cell.tableIndexPath = indexPath 作为 NSIndexPath,你应该写 cell.tableIndexPath = self。 tableViewCell,因为您已经将 indexpath 单元格位置传递给单元格,所以您只需从该单元格将位置传递给集合视图单元格 谢谢你 Βασίλης Δ。 cell.tableIndexPath = 自我。 tableViewCell 给了我错误“'HomeTableViewController' 类型的值没有成员'tableViewCell'。 是的 self 不应该是 HomeTableViewController 对象,而是 HomeTableViewCell 对象。您说“我在表格视图单元格中有一个 collectionView”,因此您创建 HomeCollectionViewCell 对象的文件应该在 HomeTableViewCell 类中。 HomeCollectionViewCell 的委托应该是 HomeTableViewCell 类而不是 HomeTableViewController。以上是关于如何从扩展的 collectionview 到达 tableview 的 indexpath.row?的主要内容,如果未能解决你的问题,请参考以下文章
CollectionView 标题在滚动时停止刷新/重新加载数据
如何在 CollectionView.Footer 中设置 XAML 按钮大小?
当用户点击 InputAccessoryView 时如何滚动到 CollectionView 的底部