swift:未正确选择TableView单元格

时间:2017-08-02 13:01:39

标签: ios swift uitableview

我有一个用数据库填充单元格的tableView,我需要选择一个单元格进行编辑。当我选择一个单元格时,这个单元格的indexPath将被发送到我创建的函数,这个函数取transform(value: any, args?: any): any { // i'm guessing that your data (value) is string return typeof value==='string' ? JSON.parse(value.replace(/'/g, '"')) : value; } 并在我单击的单元格下注入一个新单元格(通过在数据数组中添加一个新元素)那个indexpath)。

当我拥有的所有细胞都可见时,一切正常;我的indexpath.row中没有滚动的含义。但是当有一个滚动因此有一些隐藏的向下单元格时,当快速向下滚动并选择一个单元格时,我的函数会在其他地方注入一个新单元格,然后事情开始工作错误,没有任何工作按预期进行

在我的自定义单元格中单击标签时调用函数tableView

This my Table

getCollCell

如果您查看func getCollCell(_ tableViewCellIndexPath:IndexPath,_ collectionViewCellIndexPath:IndexPath) { /// this function that inject new cell /// this function get the indexpath of the cell that was clicked from collection of tableViewCell /// and indexPath of tableViewCell /// tableViewCellIndexPath is indexpath of tableViewCell /// collectionViewCellIndexPath is indexPath of collectionViewCell that was clicked from tableViewCell let lignetype = data[tableViewCellIndexPath.row]["st"]! let stTypes = [ Constant.storyBoard.prcplSeul, Constant.storyBoard.prcplMenu, Constant.storyBoard.tiersAvecSupp, ] if stTypes.contains(lignetype) { setHeightToNormal() let tmp_table = clickedTableCell["tableCell"] let tmp_collection = clickedTableCell["collectionCell"] /// save indexPath of last clicked cell of tableViewCell.collection clickedTableCell["tableCell"] = tableViewCellIndexPath clickedTableCell["collectionCell"] = collectionViewCellIndexPath if data?.count == dataT?.count { /// this condition means that there is no cell injected (no element is added to data array) insertTableRow(tableViewCellIndexPath) heighlightCell(tableViewCellIndexPath, tmp_table!, collectionViewCellIndexPath,1) }else{ if tmp_table == tableViewCellIndexPath { /// if we are still navigating in the same tableViewcell /// clicked tableViewCell is equal to last clicked tableViewCell if tmp_collection != collectionViewCellIndexPath { /// if we chosed different collectionViewCell in the same tableViewCell let index = IndexPath(row:(tmp_table?.row)! + 1, section:(tmp_table?.section)!) heightOfCell?[(tmp_table?.row)! + 1] = 150 heighlightCell(tableViewCellIndexPath, tmp_table!, collectionViewCellIndexPath,1) tableView.reloadRows(at: [index], with: .fade) }else{ removeTableRow(tmp_table!) heighlightCell(tableViewCellIndexPath, tmp_table!, collectionViewCellIndexPath,2) } }else{ /// if we try to open a tableViewCell while other tableViewcell was expanded /// we close the expanded tableViewCell and open the new one removeAndInsertTableRow(tableViewCellIndexPath, tmp_table!, collectionViewCellIndexPath) } } } } func removeTableRow(_ tableViewCellIndexPath:IndexPath) { dataT?.remove(at: tableViewCellIndexPath.row + 1) tableView.deleteRows(at:[IndexPath(row: tableViewCellIndexPath.row + 1, section: tableViewCellIndexPath.section)] , with: .fade) } func insertTableRow(_ tableViewCellIndexPath:IndexPath) { dataT?.insert(["":""], at: tableViewCellIndexPath.row + 1) heightOfCell?[tableViewCellIndexPath.row + 1] = 150 tableView.insertRows(at:[IndexPath(row: tableViewCellIndexPath.row + 1, section: tableViewCellIndexPath.section)] , with: .fade) } func removeAndInsertTableRow(_ tableViewCellIndexPath:IndexPath,_ tmp_row:IndexPath, _ collectionViewCellIndexPath:IndexPath) { tableView.beginUpdates() removeTableRow(tmp_row) heighlightCell(tableViewCellIndexPath,tmp_row, collectionViewCellIndexPath ,2) insertTableRow(tableViewCellIndexPath) heighlightCell(tableViewCellIndexPath,tmp_row, collectionViewCellIndexPath ,3) tableView.endUpdates() } func heighlightCell(_ tableViewCellIndexPath:IndexPath,_ tmp_row:IndexPath,_ collectionViewCellIndexPath:IndexPath, _ bool:Int){ if bool == 1 { if let tcell = tableView.cellForRow(at: tableViewCellIndexPath) as? TableViewCell{ for t in tcell.collectionView.visibleCells { t.backgroundColor = UIColor(hex: "#f2f2f2") } setBGColorOfCell(tableViewCellIndexPath, collectionViewCellIndexPath, "#f2f2f2") }else{ print("tableview return nil") } }else if bool == 2{ if let tcell = tableView.cellForRow(at: tmp_row) as? TableViewCell { for t in tcell.collectionView.visibleCells { t.backgroundColor = UIColor(hex: "#ffffff") } setBGColorOfCell(tmp_row, collectionViewCellIndexPath, "#ffffff") }else{ print("tableview return nil") } } else if bool == 3{ if tableViewCellIndexPath.row > tmp_row.row { heighlightCell(IndexPath(row:tableViewCellIndexPath.row + 1,section:tableViewCellIndexPath.section), tmp_row, collectionViewCellIndexPath, 1) }else{ heighlightCell(tableViewCellIndexPath, tmp_row, collectionViewCellIndexPath, 1) } } } func setBGColorOfCell(_ index:IndexPath, _ indexColl:IndexPath, _ color:String) { //let index = IndexPath(row:row, section:0) //let indexColl = IndexPath(row:cell, section:0) let cell = tableView.cellForRow(at: index) as! TableViewCell let cellcoll = cell.collectionView.cellForItem(at: indexColl) as! CollectionViewCell cellcoll.backgroundColor = UIColor(hex: "#ffffff") cell.collectionView.backgroundColor = UIColor(hex: color) } 函数,首先应用程序只会崩溃,但是当我添加条件heighlightCell时,我开始注意到问题

为什么这样做? (这些图片下来) 当我单击添加单元格然后再次单击以删除它时,会发生这种情况 enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

你可能正在搞乱重用细胞机制。 在滚动时,注入的那些没有参与 int重用,因此在重用时不会出现 将再次发生。 覆盖自定义单元格类中的prepareForReuse() 然后再次将单元格设置为默认模式(在您的 我打算删除注射剂