在UITableView Swift

时间:2017-06-08 03:57:46

标签: ios uitableview swift3 swift2

我在点击表视图行时正在扩展行。我的逻辑很简单我在点击可见行时添加了一个额外的行(即扩展),我删除它,即在挖掘可见行时删除/折叠添加的行。现在我有4个带有单独XIB的自定义单元,即A,B,C,D,所有这些单元都包含在一个类中。现在问题是这样的,考虑我在第0行扩展单元格A,下一行也是类型A,然后实例进入第二个开放单元格,当我点击第一个打开的单元格时,它崩溃了。现在我有两个解决方案,首先是一次只显示一个单元格,如果有的话,折叠所有剩余的开放单元格,或者解决不能获取单元格实例的崩溃问题。我试图通过创建

来解决第一个问题

let indexPath : IndexPath = IndexPath(row: sender.view!.tag, section: 0) self.expansionCell = self.myTableView.cellForRow(at: indexPath) as! CustomCell

但它仍然崩溃。

第二个我试过下面的

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

    if isExpanded == true
    {
        print("Expanded Row",self.expandedIndex)
       //Function to contract Cell which holds old expanded cell index
       self.contractExpandedCell(tableView: tableView, index: self.expandedIndex)
    }

    //Setting Selected index path
    self.selectedIndexPath = indexPath as NSIndexPath

    if myArray[indexPath.row] != nil {
        let cell = myTableView.cellForRow(at: indexPath) as! CustomCell

        // If user clicked last cell, do not try to access cell+1 (out of range)
        if(indexPath.row + 1 >= (myArray.count)) {
            DispatchQueue.main.async {
                cell.forwardArrowImage.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
            }
            self.isExpanded = true

            //Function to expand Cell
            expandCell(tableView: tableView, index: indexPath.row)

        }
        else {
            // If next cell is not nil, then cell is not expanded
            if(myArray[indexPath.row+1] != nil) {
                DispatchQueue.main.async {
                    cell.forwardArrowImage.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))

                }
                self.isExpanded = true
                self.expandCell(tableView: tableView, index: indexPath.row)

            } else {
                // Close Cell (remove ExpansionCells)
                DispatchQueue.main.async {
                    cell.forwardArrowImage.transform = CGAffineTransform(rotationAngle: CGFloat(180.0 * M_PI))
                }
                self.isExpanded = false
                contractCell(tableView: tableView, index: indexPath.row)

            }
        }
    }

}
 //Function to expand cell  
 private func expandCell(tableView: UITableView, index: Int) {
    // Expand Cell (add ExpansionCells)
    if (myArray[index]?.title) != nil {
        myArray.insert(nil, at: index + 1)
        self.expandedIndex = index + 1
        questionAnswerTable.insertRows(at: [IndexPath(row: index + 1, section: 0)], with: .top)
    }
}

//Function to contract cell  
private func contractCell(tableView: UITableView, index: Int) {
    if (myArray[index]?.title) != nil {
        myArray.remove(at: index + 1)
        questionAnswerTable.deleteRows(at: [IndexPath(row: index + 1, section: 0 )], with: .top)
    }

}

即使这样也不能顺利进行,因为添加行时行数会发生变化,如果我尝试展开下一个单元格,则会打开第三个单元格。

任何一种解决方案都可行。 请帮帮我们TIA

2 个答案:

答案 0 :(得分:0)

添加

  

var currentExpandIndexpath:NSIndexpath?

并在didSelectRowAt更改

expandCell(tableView: tableView, index: indexPath.row)

if currentExpandIndexpath == nil{  
   currentExpandIndexpath = indexpath  
}  
if currentExpandIndexpath == indexpath{  
   // do nothing  
}else{    
// contract expand cell before expand new cell  
    contractCell(tableView: tableView, index: currentExpandIndexpath.row)  
    self.expandCell(tableView: tableView, index: indexPath.row)  
// update current expand cell  
    currentExpandIndexpath = indexpath  
}  

这只是解决方案。代码不正确。

答案 1 :(得分:0)

这是一个简单的逻辑。获取一个变量来存储选定的索引路径。

当点击DidSelectRowAtIndexPath存储的任何单元格选择为该变量并重新加载表时。

当表重载高度行方法检查索引路径时。如果indexpath等于变量中的indexpath存储,则该行应该具有比其他行更大的大小。

这只是简单的逻辑