我在Swift中遇到一个带有Json Source的小问题。
在一个Tableview中,我得到了Json Source:
let url = URL(string: "http://url")!
let urlSession = URLSession.shared
let task = urlSession.dataTask(with: url) { (data, response, error) in
let jsonData = try! JSONSerialization.jsonObject(with: data!, options: []) as? [String: AnyObject]
//adressiere Array in JSON Dictionary
self.Devs = jsonData?["devices"] as! [[String:AnyObject]]
我是didSelectRowAt部分我让用户选择行,并将Json的ID添加到UserDefault数组。
第一个ViewController中的我有与上面相同的Json代码,但我用UserDefault数组过滤它:
devArray是包含用户选择的ID的数组。
let jsonData = try! JSONSerialization.jsonObject(with: data!, options: []) as? [String: AnyObject]
//adressiere Array in JSON Dictionary
self.Devs = jsonData?["devices"] as! [[String:AnyObject]]
//Filter Array
let filterarray = self.devArray
self.filteredArray = self.Devs.filter { filterarray.contains($0["id"] as! String) }
第一个Viewcontroller有一个CollectionView,我已经实现了重新排序Cells的功能:
func collectionView(_ collectionView: UICollectionView,
moveItemAt sourceIndexPath: IndexPath,
to destinationIndexPath: IndexPath)
{
// TODO: Update data model to reflect the change
let temp = devArray[sourceIndexPath.row]
devArray[sourceIndexPath.row] = devArray[destinationIndexPath.row]
devArray[destinationIndexPath.row] = temp
}
这会重新排序devArray,它可以工作。(我将它打印到控制台) 但是一旦刷新视图,它就会返回并按照Ids来自json源的顺序排序。 我必须拉Json,因为我需要更改json源的值。
有没有人有想法?我希望我能正确描述我的问题;-)
我的cellForItemAt:
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let colcel = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell
let devListItem = filteredArray[indexPath.row]
//Attribute
let devListValue = (devListItem["attributes"]?.value(forKey: "value"))
let resultDevListValue = String(describing: devListValue!)
//Cell Text & Color & See if it is a Switch
if (devListItem["template"]?.contains("switch"))! {
if resultDevListValue.contains("0") {
colcel.topLabel.text = devListItem["name"] as? String
} else {
colcel.topLabel.text = devListItem["name"] as? String
}
} else {
//print("kein switch")
}
return colcel
}
答案 0 :(得分:0)
您正在使用cellForItemAt方法中的filteredArray构建单元格:
let devListItem = filteredArray[indexPath.row]
但是当你移动单元格时,你会更新devArray
let temp = devArray[sourceIndexPath.row]
devArray[sourceIndexPath.row] = devArray[destinationIndexPath.row]
devArray[destinationIndexPath.row] = temp
我认为这是两个不同的数组。您需要在两个位置使用相同的数组,或在移动单元格时同步它们