使用NIB无法识别UITableViewCell内的Clicked Cell UITableView

时间:2018-01-02 03:03:23

标签: ios iphone swift uitableview swift4

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

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

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的委托和dataSource,并为其提供了一个标记。

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)

app break抱怨我正在尝试使用相同的indexPath将不同的单元格出列。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

不要使用  let cell = tableView.dequeueReusableCell(withIdentifier:)didSelect方法中的didDeSelect

使用

let cell = tableView.cellForRow(at: indexPath)

我希望这会对你有所帮助。