Swift-如何通过其属性重新排列tableview中的所有单元格?

时间:2019-04-01 22:42:28

标签: ios swift

我有一个带有单元格的tableView。还有items,其类型为Dialog。这是cellForRow At函数:

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


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

    var item: Dialog

    item = items[indexPath.row]

    ......

    return cell
}

现在,我想对这些单元格进行编号为item.getLastMessageCreateAt()的排序,这将返回一个Int编号。我该怎么办?

到目前为止,这是我已经尝试过的方法:

func getAllCells() -> [UITableViewCell] {

    var cells = [UITableViewCell]()
    for i in 0...tableView.numberOfSections-1
    {
        for j in 0...tableView.numberOfRows(inSection: i)-1
        {
            if let cell = tableView.cellForRow(at: NSIndexPath(row: j, section: i) as IndexPath) {

                cells.append(cell)
            }

        }
    }
    return cells
}

func reorderCells() {

    var lastMessageAgoArray = [Int]()
    for item in self.items {
        lastMessageAgoArray.append(item.getLastMessageCreateAt())
    }
    let timeAgoInNumArrayBigToSmall: [Int] = lastMessageAgoArray.sorted { $0 > $1 }

    let cells = self.getAllCells()

    for cell in cells {
        let row = self.tableView.indexPath(for: cell)?.row
        if ( lastMessageAgoArray[row!] != timeAgoInNumArrayBigToSmall[row!] ) {
            if let index = timeAgoInNumArrayBigToSmall.index(of: lastMessageAgoArray[row!]) {
                self.tableView.moveRow(at: IndexPath(row: row!, section: 0), to: IndexPath(row: index, section: 0))
            }
            self.tableView.reloadData()
        }
    }

}

我已经尝试运行此程序,但是我在此行的结尾处获得了nil中的row

let row = self.tableView.indexPath(for: cell)?.row

那我应该怎么订购这些电池?

非常感谢您!

1 个答案:

答案 0 :(得分:1)

将项目设置为:

items = myItemList.sorted { $0.getLastMessageCreateAt() > $1.getLastMessageCreateAt() } 

您可以将func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath)中的代码保持不变,并删除getAllCells()reorderCells()

您不想对单元格本身进行排序,因为表格视图会根据屏幕上当前可见的单元格对它们进行重用。