Swift 3过滤器Json&重新排序

时间:2017-04-05 12:02:14

标签: ios json swift

我在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
}

1 个答案:

答案 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

我认为这是两个不同的数组。您需要在两个位置使用相同的数组,或在移动单元格时同步它们