使用 NIB 无法识别 UITableViewCell 内单击的单元格 UITableView

Posted

技术标签:

【中文标题】使用 NIB 无法识别 UITableViewCell 内单击的单元格 UITableView【英文标题】:Not Recognizing Clicked Cell UITableView inside UITableViewCell using NIB 【发布时间】:2018-01-02 03:03:22 【问题描述】:

我正在编写一个具有多个单元格的仪表板的应用程序。其中一个单元格有问题,但答案是动态填充的,所以我决定使用 UITableView 来处理。

我将 UITableViewCell 设置为内部 UITableView 的委托和数据源,并进行了定义单元格和选定状态的配置。

extension SurveyTableViewCell: UITableViewDelegate, UITableViewDataSource 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        answers = model.getSurveyAnswers()

        return (answers?.count)!
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        let cell = tableView.dequeueReusableCell(withIdentifier: InsideSurveyTableViewCell.identifier, for: indexPath) as! InsideSurveyTableViewCell

        cell.idAnswer.text = alphabetQuestion[indexPath.row]
        cell.answer.text = answers?[indexPath.row]

        return cell
    

    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat 
        return 100.0
    

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

        let cell = tableView.dequeueReusableCell(withIdentifier: InsideSurveyTableViewCell.identifier, for: indexPath) as! InsideSurveyTableViewCell

        cell.selectRow()
    

    func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) 
        let cell = tableView.dequeueReusableCell(withIdentifier: InsideSurveyTableViewCell.identifier, for: indexPath) as! InsideSurveyTableViewCell

        cell.deselectRow()
    

但是内部 UITableViewCell 中单元格内的点击无法识别。在将用户回答发送到服务器后,我需要识别此点击。

我看到了一些解决方案,但使用了故事板。我在我的项目中只使用笔尖。

但我仍然尝试使用我在 youtube 上看到的使用情节提要的方法。

在将使用内部 UITableView 的单元格上,我声明了一个函数来设置内部 tableView 的委托和数据源,并给它一个标签。

extension SurveyTableViewCell 

    func setTableViewDataSourceDelegate<D:UITableViewDelegate & UITableViewDataSource>(_ dataSourceDelegate: D, forRow row: Int) 
        subTableView.dataSource = dataSourceDelegate
        subTableView.delegate = dataSourceDelegate

        subTableView.reloadData()
    

比在管理外部 UITableView 的 viewController 上:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        if tableView.tag == 1 
            let cell = tableView.dequeueReusableCell(withIdentifier: InsideSurveyTableViewCell.identifier) as! InsideSurveyTableViewCell

            cell.idAnswer.text = "A."
            cell.answer.text = "QUALQUER COISA"

            return cell
        

        if retrivedCell is SurveyTableViewCell 

            let cell = tableView.dequeueReusableCell(withIdentifier: SurveyTableViewCell.identifier, for: indexPath) as! SurveyTableViewCell
            cell.delegate = self

            cell.setTableViewDataSourceDelegate(self, forRow: indexPath.row)

            cell.setPositionRow(row: indexPath.row - 1)
            cell.subTableView.rowHeight = UITableViewAutomaticDimension
            cell.subTableView.estimatedRowHeight = 50

            return cell
        
 


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        if tableView.tag == 1 
            return 3
        

        var numberOfCells: Int = 0

        if cellsToPresent != nil 
            numberOfCells = cellsToPresent!.count
        

        return numberOfCells + 1
 

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    if tableView.tag == 1 
        let cell = tableView.dequeueReusableCell(withIdentifier: InsideSurveyTableViewCell.identifier) as! InsideSurveyTableViewCell

        cell.selectRow()
    


func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) 

    if tableView.tag == 1 
        let cell = tableView.dequeueReusableCell(withIdentifier: InsideSurveyTableViewCell.identifier) as! InsideSurveyTableViewCell

        cell.deselectRow()
    

selectRow和deselectRow是改变内部tableView单元格标签的方法。

但还是没有成功。

如果我使用方法:

tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)

应用程序中断抱怨我正在尝试使用相同的 indexPath 将不同的单元格出列。

感谢您的帮助。

【问题讨论】:

不确定这是否是问题所在,但您在使单元格出列的第一个位置没有for: indexPath,只有第二个。 你试过bringSubview(toFront:)的方法吗? @Skywalker,没试过。我不清楚我应该在哪里使用它。 @GilbertoKreisler 尝试使用我在答案下面提到的方法。如果您的问题是因为这个,它应该可以正常工作......并且会提高性能 【参考方案1】:

不要使用 let cell = tableView.dequeueReusableCell(withIdentifier:)didSelectdidDeSelect 方法中。

使用

let cell = tableView.cellForRow(at: indexPath)

希望对你有帮助。

【讨论】:

再次调用cellForRow(at:)方法会有性能问题。为什么不将单元格保存在数组中并访问array[indexPath.row]?我认为这对性能会更好。

以上是关于使用 NIB 无法识别 UITableViewCell 内单击的单元格 UITableView的主要内容,如果未能解决你的问题,请参考以下文章

使用 xcode 重构的 NIB 名称未更改

无法从主包中按名称加载 Nib 文件

无法运行命令'StripNIB <filename>.nib' - XCode

无法在捆绑包中加载 NIB。可可豆项目

XCode - 无法加载 NIB 文件包

设置可重用标头时出错:'无法在包中加载 NIB