通过按钮排序表视图中的单元格

时间:2017-05-27 12:07:42

标签: ios xcode api sorting tableview

我有一个包含API数据的表格视图。 每个单元格都有几个属性。我想要的是按照所选按钮(这三个矩形)对细胞进行排序。

我不知道我该怎么做。我想我需要树方法,每个方法都用于点击按钮。但是如何处理数据的排序和重新加载? 谢谢你的回答。enter image description here

 override func viewDidLoad() {
    super.viewDidLoad()
    callAlamo(url: urlAPI)
}


func callAlamo(url: String){
    Alamofire.request(url).responseJSON(completionHandler: {
        response in
        self.parseData(JSONData: response.data!)
    })
}

func parseData(JSONData: Data){
    do{
        var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard
       // print(readableJSON)
        if let rows = readableJSON["rows"] as? [JSONStandard]{
            print(rows)


            for i in 0..<rows.count{
            let row = rows[i]
            if let name = row["name"] as? String{
                if name.isEmpty == false{
                if let status = row["status"] as? String{
                    if let counter = row["counter"] as? String{

                        items.append(Station.init(place: name, counter: counter, status: status))

                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }

                    }else{


                        let counter = "no data"
                        items.append(Station.init(place: name, stationsCount: counter, status: status))

                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }

                    }
                }

                }
            }

        }
        }
    }catch{
        print(error)
    }

}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.items.count
}


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! Cell

    cell.place.text = items[indexPath.row].place
    cell.stationsCount.text = items[indexPath.row].stationsCount
    let num = items[indexPath.row].status
    let value = picDictionary[num!]
    print(num!, value!)
    cell.statusSign.image = UIImage(named: value!)

    return cell
}

有时我会从API中获取null值,然后,我将值赋予字符串&#34;没有数据&#34;。

if let counter = row["counter"] as? String{
     /////code
else{
   let counter = "no data"
   //////
}

我不想让这些价值观参与分拣过程,因为它们不是数字。怎么做?

1 个答案:

答案 0 :(得分:1)

对三个按钮执行三个操作,然后使用它对数组进行排序,然后重新加载表。

@IBAction func sortWithName(_ sender: UIButton) {
     items.sort { $0.place < $1.place }
     self.tableView.reloadData()
}

@IBAction func sortWithStatus(_ sender: UIButton) {
     items.sort { $0.status < $1.status }
     self.tableView.reloadData()
}

@IBAction func sortWithStatusCount(_ sender: UIButton) {
     //stationsCount is looks like number so sort it using compare with numeric option
     items.sort { $0.stationsCount.compare($1.stationsCount, options: .numeric) == .orderedAscending } 
     self.tableView.reloadData()
}

编辑:声明另一个名为allItems的数组,与声明项目数组的方式相同。还有一件事我没有注意到你首先在for循环中重新加载tableView以便它将重新加载n(o)次而不是你需要在for循环之后重新加载它一次,然后重新加载{ {1}}并将tableView与您的商品一起设置,如果您可以将其合并一次,那么您制作的商品数量太多了。

allItems

现在更改所有按钮操作。

为您的三个按钮执行三个操作并使用它对数组进行排序,然后重新加载表。

for row in rows {
    if let name = row["name"] as? String, 
        let status = row["status"] as? String,
        !name.isEmpty {

          if let counter = row["counter"] as? String {
              items.append(Station.init(place: name, counter: counter, status: status))                        
          }else{
              let counter = "no data"
              items.append(Station.init(place: name, stationsCount: counter, status: status))
          }
    }
}
//Set allItems with items
self.allItems = items
DispatchQueue.main.async {
    self.tableView.reloadData()
}