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

问题描述 投票:0回答:1

我有一个包含 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获取空值,然后,我将值传递给字符串“无数据”。

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

而且我不想让这些值参与排序过程,因为它们不是数字。如何做到这一点?

ios swift xcode sorting tableview
1个回答
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()
}

编辑: 以与声明 items 数组相同的方式声明另一个名为

allItems
的数组。我首先没有注意到的一件事是,您在 for 循环内重新加载
tableView
,以便它将重新加载
n(o)
次,而不是在 for 循环之后以及重新加载
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()
}

现在像这样更改所有按钮操作。

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

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

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

@IBAction func sortWithStatusCount(_ sender: UIButton) {
     //Filter your array first
     items = allItems.filter { $0.stationsCount != "no data" }
     //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()
}
© www.soinside.com 2019 - 2024. All rights reserved.