0

我有以下 json 列表:

 [
     {

         "title": "Languages",
         "name_list": [
             {

                 "title": "Hindi",
                 "locked": true
             },
             {
                 "title": "Hindi1",
                 "locked": true
             },
             {
                 "title": "Hindi2",
                 "locked": false
             },
             {
                 "title": "Hindi3",
                 "locked": true
             },
             {
                 "title": "Hindi4",
                 "locked": false
             }],
     },
     {

         "title": "Subject",
         "name_list": [
             {
                 "title": "Hindi4",
                 "locked": false
             },
             {
                 "title": "Hindi4",
                 "locked": true
             },
             {
                 "title": "Hindi4",
                 "locked": true
             }]
     }    
 ]

我正在使用表格视图和内部表格视图我有集合视图。

现在在我的表格视图中,我将显示标题。在我的集合视图中,我将name_list在每个集合视图单元格上显示标题。现在它工作正常。

我需要的是,正如您在 json 中看到的那样,有许多锁定 = true 和 false。

所以,在我的表格视图中 - 哪个对象的locked == false. 我需要首先显示该标题。例如。

在我上面的json中,title=subject只有一个locked=false,但是title=language有2个locked=false。所以在我的表格视图中,第一个主题必须显示和语言。

在每个集合视图中相同,哪个对象已锁定 = false 需要首先显示在我的集合视图单元格中。

请提供任何帮助。

这是我的表格视图代码:

cellTitleLabel.text = jsonData?["title"] as? String ?? ""

在我的收藏视图中:

if let gamesList = jsonData?["name_list"]  as? [[String: Any]] {
   let Info = nameList[indexPath.item]
   collectionCell.cellTitleLabel.text = Info["title"] as? String ?? ""
}

   var Info: [String: Any]?{
        didSet {

            cellTitleLabel.text = jsonData?["title"] as? String ?? ""
            collectionView.reloadData();

            guard let gamesList = jsonData?["name_list"]  as? [[String: Any]] else {
                return
            }
        }
    }

在此处输入图像描述

4

5 回答 5

0

只需使用此功能,它就会为您工作而无需创建任何模型。

func sortArr(array : [[String:Any]]) -> [[String:Any]]{
var arr = array
for i in 0...arr.count - 1 {
    var dict = arr[i]
    let name_list = dict["name_list"] as! [[String:Any]]
    let lockedItems = name_list.filter { (item) -> Bool in
        let locked = item["locked"] as! Bool
        if locked == false {
            return true
        }
        return false
    }
    print(lockedItems.count)
    dict["lockedItems"] = lockedItems.count
    arr[i] = dict
}
arr = arr.sorted(by: { (item1, item2) -> Bool in
    let lockedcount1 = item1["lockedItems"] as! Int
    let lockedcount2 = item2["lockedItems"] as! Int
    return lockedcount1 < lockedcount2
})
return arr
}

已编辑

import UIKit
var arr = [
[

"title": "Languages",
"name_list": [
[
"title": "Hindi",
"locked": true
],
[
"title": "Hindi1",
"locked": true
],
[
"title": "Hindi2",
"locked": false
],
[
"title": "Hindi3",
"locked": true
],
[
"title": "Hindi4",
"locked": false
]],
],

[

"title": "Subject",
"name_list": [
[
"title": "Hindi4",
"locked": false
],
[
"title": "Hindi4",
"locked": true
],
[
"title": "Hindi4",
"locked": true
]]
]

]

func sortArr(array : [[String:Any]]) -> [[String:Any]]{
    var arr = array
    for i in 0...arr.count - 1 {
        var dict = arr[i]
        let name_list = dict["name_list"] as! [[String:Any]]
        let lockedItems = name_list.filter { (item) -> Bool in
            let locked = item["locked"] as! Bool
            if locked == false {
                return true
            }
            return false
        }
        print(lockedItems.count)
        dict["lockedItems"] = lockedItems.count
        arr[i] = dict
    }
    arr = arr.sorted(by: { (item1, item2) -> Bool in
        let lockedcount1 = item1["lockedItems"] as! Int
        let lockedcount2 = item2["lockedItems"] as! Int
        return lockedcount1 < lockedcount2
    })
    return arr
}

var array = sortArr(array: arr)
print(array)
于 2019-02-13T08:05:59.980 回答
0
struct Root {
    let nameList: [NameList]
    let title : String
    init(dictionary: [String: Any]) {
        self.title = dictionary["title"] as? String ?? ""
        self.nameList = (dictionary["name_list"] as? [[String:Any]] ?? []).map(NameList.init)
    }
}

struct NameList {
    let locked: Bool
    let title: String
    init(dictionary: [String: Any]) {
        self.locked =  dictionary["locked"] as? Bool == true
        self.title = dictionary["title"] as? String ?? ""
    }
}

let jsonData = Data("""
[
  {
    "title" : "Languages",
    "name_list" : [
      {
        "title" : "Hindi",
        "locked" : true
      },
      {
        "title" : "Hindi1",
        "locked" : true
      },
      {
        "title" : "Hindi2",
        "locked" : false
      },
      {
        "title" : "Hindi3",
        "locked" : true
      },
      {
        "title" : "Hindi4",
        "locked" : false
      }
    ]
  },
  {
    "title" : "Subject",
    "name_list" : [
      {
        "title" : "Hindi4",
        "locked" : false
      },
      {
        "title" : "Hindi4",
        "locked" : true
      },
      {
        "title" : "Hindi4",
        "locked" : true
      }
    ]
  }
]
""".utf8)

let dictionaries = (try? JSONSerialization.jsonObject(with: jsonData)) as? [[String:Any]] ?? []

print("\nAll Models", terminator: "\n============\n")
let models = dictionaries.map(Root.init)
for model in models {
    print(model.title)
    for name in model.nameList {
        print(name.title)
     }
}
print("\nunlockedModels", terminator: "\n============\n")
let unlockedDictionary: [String: [NameList]] = models.reduce(into: [:]) {
    $0[$1.title] = $1.nameList.filter{ $0.locked}
}
for (title, nameList) in unlockedDictionary {
    print(title)
    for name in nameList {
        print(name.title)
    }
}
于 2019-02-13T09:22:44.820 回答
0

我的解决方案是在 tableview 单元格中创建一个函数,并在 cellForRowAt indexPath 中使用相应的数组调用它。您可以简单地通过调用该函数cell. fillCollectionView(array)

class ExampleTableViewCell: UITableViewCell {

@IBOutlet weak var exampleCollectionView: UICollectionView!

var array = [[String:Any]]()

func fillCollectionView(with array: [[String:Any]]) {
    self.array = array
    exampleCollectionView()
}
于 2019-02-13T07:29:59.020 回答
0

我在 json 下面用这个来做假人

[
    {
        "title": "Languages",
        "name_list": [
            {
                "title": "Sub 1",
                "locked": true
            },
            {
                "title": "Sub 2",
                "locked": true
            },
            {
                "title": "Sub 3",
                "locked": false
            },
            {
                "title": "Sub 4",
                "locked": true
            },
            {
                "title": "Sub 5",
                "locked": false
            }
        ]
    },
    {
        "title": "Subject",
        "name_list": [
            {
                "title": "Sub 6",
                "locked": false
            },
            {
                "title": "Sub 7",
                "locked": false
            },
            {
                "title": "Sub 8",
                "locked": false
            }
        ]
    }
]

此 json 的模型结构:

public struct TestModel {

    public var nameList : [NameList]
    public var title : String
}

public struct NameList {

    public var locked : Bool
    public var title : String

}

我的 json 在本地项目中,所以我使用下面的 func 来

func getLocalData(){
    let url = Bundle.main.url(forResource: "testjson", withExtension: "json")!
    do {
        let jsonData = try Data(contentsOf: url)
        let json = try JSONSerialization.jsonObject(with: jsonData) as! [Any]
       self.arrData = self.createDataModel(json)
    }
    catch {
        print(error)
    }
}

将 json 绑定到模型结构中的函数

func createDataModel (_ json : [Any]) -> [TestModel] {
    var arr = [TestModel]()

    for adata in json {
        let aDictItems = adata as! [String : Any]
        let aNameListData = aDictItems["name_list"] as! [Any]
        var arrNameList = [NameList]()

        for aName in aNameListData {
            let adictname = aName as! [String : Any]
            arrNameList.append(NameList.init(locked: adictname["locked"] as! Bool, title: adictname["title"] as! String ))
        }

        arr.append(TestModel.init(nameList: arrNameList, title: aDictItems["title"] as! String))

    }
    return arr
}

最后,函数将您的列表排序为锁定计数 ( false) 并返回过滤后的数据。

func filterData (_ searchText : String) -> [TestModel] {
    if searchText == "" { return arrData }

    let s = arrData.sorted { (res1, res2) -> Bool in
        var count1 = 0, count2 = 0
        for r in res1.nameList {
            if !r.locked {
                count1 += 1
            }
        }
        for r in res2.nameList {
            if !r.locked {
                count2 += 1
            }
        }
        return count1 > count2
    }

    let f = s.filter {
        $0.nameList.contains(where: { (aNameRes) -> Bool in
          aNameRes.title.contains(searchText)
        })
    }
    return f
}

编辑:在单元格中显示数据

tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
    return filtered.Count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    :
    // filtered[indexPath.row].title // your tableview cell title
    // filtered[indexPath.item].nameList // your collectView Data, Use this array to show data in collectionview
}

注意:您的 API json 数据和过滤后的数据始终相同。当搜索栏中没有字符串时,您需要将过滤后的数据与 api 原始数据进行切换。


如果您的要求发生变化,请告诉我。

于 2019-02-13T07:28:03.493 回答
0

在这种情况下,如果要显示locked == false为第一个,则需要重新排列数组字典(按锁定排序)。然后将数据加载到UItableviewUIcollectionview

于 2019-02-13T07:35:11.347 回答