我在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)
}
答案 0 :(得分:0)
您希望以两种不同的方式显示您的类别:打开和关闭。
您遇到问题是因为您试图通过在didSelectRowAt
和didDeselectRowAt
中将新单元格取消来更新显示内容。这是不正确的。
更新显示的正确方法是调用:
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
,您可以设置类别显示更改的动画。