首页 > 解决方案 > 如何在 iOS Swift 的 didselect 方法中重新排列单元格?

问题描述

考虑我有一个数组 ["one","two","three","four","five"]。我想在 didselect 方法中重新排列单元格。

例如:

var items = [UserObject]()

模型:

 import SwiftyJSON

class UserObject {

var URL: String!
var Name: String!


  required init(json: JSON) {
    URL = json["URL"].stringValue
    Name = json["Name"].stringValue
  }
}

当点击单元格二时,数组应该是 ["two","three","four","five","one"]

当点击单元格四时,数组应该是 ["three","four","five","one","two"]

我试过这样并且工作正常,但我需要另一种方法

在 didselect 方法中

var data = self.items[0]
self.items.remove(at: 0)
self.items.insert(data, at: 4)
tableView.reloadData()

有没有其他方法可以实现这一目标?

我如何使用 tableview 和没有 tableview 来实现这一点?

标签: arraysswiftxcodeuitableview

解决方案


当您单击 a 时,cell/index您正在将选定的一个移动到index 0

您可以实现它extension并在需要转移时使用它:

extension Array {
    func shiftRight(_ amount: Int = 1) -> [Element] {
        var amount = amount
        assert(-count...count ~= amount, "Shift amount out of bounds")
        if amount < 0 { amount += count }  // this needs to be >= 0
        return Array(self[amount ..< count] + self[0 ..< amount])
    }

    mutating func shiftRightInPlace(amount: Int = 1) {
        self = shiftRight(amount)
    }
}

资源

现在,您 UICollectionViewUITableView您可以在didSelect功能中轻松使用它。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
items = items.shiftRight(indexPath.row)
}

最后一步是向您的数据源添加一个属性侦听器,这样您就可以在tableViewcollectionView这样更改值时自动刷新

var items = ["one","two","three","four","five"] {
    didSet {
        //tableView.reloadData()
    }
}

除了你的情况:

改变这个:var items = [UserObject]()

对此:

var items: [UserObject] = [] {
        didSet {
            DispatchQueue.main.async {
                tableView.reloadData()
            }
        }
    }

推荐阅读