如何从扩展的 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 分配给集合视图的每个单元格,您必须传递HomeTableViewCelltableIndexPath 值。

您的错误是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 的底部

如何从collectionview的数据源中获取项目数

为 tableview 单元内的 collectionview 加载更多功能

如何从collectionview重新加载部分