考虑我有一个数组["一","二","三","四","五"]。 我想在 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
}
}
点击单元格二时,数组应该是["二","三","四","五","一"]
点击单元格四时,数组应为["三","四","五","一","二"]
我尝试过这样,它工作正常,但我需要另一种方法
在选择方法中
var data = self.items[0]
self.items.remove(at: 0)
self.items.insert(data, at: 4)
tableView.reloadData()
有没有其他方法可以实现这一目标?
如何使用表视图和无表视图来实现此目的?
当您单击一个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)
}
}
源
现在,对于您的UICollectionView
或UITableView
,您可以在didSelect
功能中轻松使用它。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
items = items.shiftRight(indexPath.row)
}
最后一步是将属性侦听器添加到数据源,以便在tableView
或collectionView
更改此类值时自动刷新
var items = ["one","two","three","four","five"] {
didSet {
//tableView.reloadData()
}
}
除了您的情况:
更改此内容:var items = [UserObject]()
对此:
var items: [UserObject] = [] {
didSet {
DispatchQueue.main.async {
tableView.reloadData()
}
}
}
您可以使用以下函数。
//Pass index (selected cell index)
func arrangArray(ForIndex index: Int) {
for i in 0..<self.items.count {
if i == index {
break
}
let user = self.items[0]
self.items.remove(at: 0)
self.items.append(user)
}
}
......
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
arrangArray(ForIndex: indexPath.row)
tableView.reloadData()
}