swift:如何在两个UITableViewCell之间翻转单元格

时间:2018-02-10 11:50:21

标签: ios swift tableview flip

我在UITableViewCell中有两个UITableViewController

我想在点击didSelect方法上翻转indexPaths。

当我在tableViewCellOne中单击indextPath.row“0”时,它将显示tableViewCrowTwo的indexPath.row“0”。

现在它没有正确翻转。在didSelect方法上点击几次后也会崩溃应用程序。

错误信息是:

  

//由于未捕获的异常终止应用程序' NSInternalInconsistencyException',原因:'尝试将同一索引路径的多个单元格出列,这是不允许的。如果您确实需要出现比表视图请求更多的单元格,请使用-dequeueReusableCellWithIdentifier:方法(不带索引路径)。单元格标识符:FlipTableViewCellZero,索引路径:

var isOpen = true

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

    if isOpen{

        let cell = tableView.dequeueReusableCell(withIdentifier: "FlipTableViewCellZero", for: indexPath) as! FlipTableViewCellZero

        var categoryObject = arrNewsList[indexPath.section]

        cell.profileImage = categoryObject[indexPath.row].textView
        return cell

    }else{

        let cell = tableView.dequeueReusableCell(withIdentifier: "FlipTableViewCellOne", for: indexPath) as! FlipTableViewCellOne

        var categoryObject = arrNewsList[indexPath.section]

        cell.newsTextView.text = categoryObject[indexPath.row].details

        return cell

    }
    return tableView.dequeueReusableCell(withIdentifier: "FlipTableViewCellZero", for: indexPath)

}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    isOpen = true

    let selectedCell = tableView.dequeueReusableCell(withIdentifier: "FlipTableViewCellOne", for: indexPath) as! FlipTableViewCellOne
    UIView.transition(with: selectedCell, duration: 0.6, options: .transitionFlipFromLeft, animations: nil, completion: nil)
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    isOpen = false

    let deselectedCell = tableView.dequeueReusableCell(withIdentifier: "FlipTableViewCellZero", for: indexPath) as! FlipTableViewCellZero
    UIView.transition(with: deselectedCell, duration: 0.6, options: .transitionFlipFromLeft, animations: nil, completion: nil)
}

1 个答案:

答案 0 :(得分:0)

您希望以两种不同的方式显示您的类别:打开和关闭。

您遇到问题是因为您试图通过在didSelectRowAtdidDeselectRowAt中将新单元格取消来更新显示内容。这是不正确的。

更新显示的正确方法是调用:

  • tableView.reloadData,重新加载整个表格视图,或
  • tableView.reloadRows(at:with:),只重新加载指定的行

为简单起见,我将使用此示例中的第一个选项。

您的代码的另一个问题是您尝试使用类级变量isOpen来记住类别的状态。当您有多个类别时,这不起作用。

更好的方法是添加isOpen作为categoryObject类的属性。您最初将其设置为false,然后在点按行时切换它。这是一个可能的解决方案:

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

    let categoryObject = arrNewsList[indexPath.section]

    if categoryObject.isOpen {
        let cell = tableView.dequeueReusableCell(withIdentifier: "FlipTableViewCellZero", for: indexPath) as! FlipTableViewCellZero

        cell.profileImage = categoryObject[indexPath.row].textView
        return cell
    }
    else {
        let cell = tableView.dequeueReusableCell(withIdentifier: "FlipTableViewCellOne", for: indexPath) as! FlipTableViewCellOne

        cell.newsTextView.text = categoryObject[indexPath.row].details
        return cell
    }
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {    
    let categoryObject = arrNewsList[indexPath.section]
    categoryObject.isOpen = true
    tableView.reloadData()
}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    let categoryObject = arrNewsList[indexPath.section]
    categoryObject.isOpen = false
    tableView.reloadData()
}

现在,这并没有为您提供所需的动画,但它解决了当前代码的核心问题。

要制作动画,请查看reloadRows(at:with:) reloadData()。使用此方法而不是/auth => auth home page /auth/login => login page /auth/register => register page /auth/forgot => lost password page /auth/reset => change password page ,您可以设置类别显示更改的动画。