SWIFT ios сортирует данные таблицы по статусу - PullRequest
0 голосов
/ 19 мая 2018

Лучший способ сортировать данные табличного представления по статусу, я предоставил код ниже.Все статусы «хорошо» находятся вверху, а статус «плохо» находится ниже или будет следовать.Статус, равный хорошему, должен быть сверху статуса, равного плохому.Также я думаю, что было бы лучше отсортировать его после получения ответа, прежде чем добавлять его в getalldetail

case .success(_):
                guard let json = response.result.value as! [[String:Any]]? else{ return}

                print("Api Response : \(json)")

                let filtered  = json.filter { (dict) -> Bool in
                    guard let status : [String : String] = dict["status"] as? [String : String], let statusString = status["name"] else {
                        return false
                    }
                    var a = statusString.compare("test") != .orderedSame
                    var b =  statusString.compare("testing") != .orderedSame
                    return a && b
                }

                for item in json {

                    self.getAllDetail = filtered
                    self.tableView.reloadData()
                    self.refresher.endRefreshing()
                    self.activityIndicator.stopAnimating()
//                    UIApplication.shared.beginIgnoringInteractionEvents()


                }
                if !self.getAllDetail.isEmpty{
                    DispatchQueue.main.async {
                         self.tableView.reloadData()
                    }
                }
                break

            case .failure(_):
                print("Error")
                break

            }
        }



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


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

         return getAllDetail.count
    }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Table view cells are reused and should be dequeued using a cell identifier.
        let cellIdentifier = "ToDoListTableViewCell"
        let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ToDoListTableViewCell
        cell.delegate = self


//        let toDoActionItem = fetchedResultsController.object(at: indexPath)

        if let getTempDetails: [String : Any] = getAllDetail[indexPath.row] {

            if let str = getTempDetails["status"] as? [String: String] {
                if let name = str["name"] {
                    if name == "good" {
                        cell.toDoItemLabel.text = getTempDetails["name"] as? String
                        cell.statuslabel.backgroundColor = created

//                        cell.label.textColor =  UIColor(red: 0.9294, green: 0.3333, blue: 0.1804, alpha: 1.0)
//                        cell.backgroundColor = created


                    }else if name == "bad" {
                       cell.toDoItemLabel.text = getTempDetails["name"] as? String
                       cell.statuslabel.backgroundColor = done
                       cell.checkBoxButton.isSelected = true
                    }

                    } else {
                        print("false")
                       cell.toDoItemLabel.text = "Data"
                    }
                }
                }
            }

1 Ответ

0 голосов
/ 19 мая 2018

В вашем коде есть еще несколько неправильных вещей.

Вы удаляете индикатор активности только в блоке успеха?Есть ли цикл для элемента в JSON?могу я узнать, почему ты это сделал?:

let filtered  = json.filter { (dict) -> Bool in
    guard let status : [String : String] = dict["status"] as? [String : String], let statusString = status["name"] else {
        return false
    }
    var a = statusString.compare("test") != .orderedSame
    var b =  statusString.compare("testing") != .orderedSame
    return a && b
}
for item in json {
   self.getAllDetail = filtered
   self.tableView.reloadData()
   self.refresher.endRefreshing()
   self.activityIndicator.stopAnimating()
}
if !self.getAllDetail.isEmpty{
    DispatchQueue.main.async {
        self.tableView.reloadData()
    }
}

Вы можете заменить этот код на:

self.refresher.endRefreshing()
self.activityIndicator.stopAnimating()
//Remove activity indiactor when you get any response not just success, otherwise for failure it will keep aimating, then in success case


let filtered  = json.filter { (dict) -> Bool in
    guard let status : [String : String] = dict["status"] as? [String : String], let statusString = status["name"] else {
        return false
    }
    var a = statusString.compare("test") != .orderedSame
    var b =  statusString.compare("testing") != .orderedSame
    return a && b
}

if !self.getAllDetail.isEmpty{
    DispatchQueue.main.async {
        // Sorting using string comparison, g > b in ASCII value 
        self.getAllDetail = filtered.sorted { (firstObject, secondObject) -> Bool in
        guard let statusDictFromFirst = firstObject["status"] as? [String: String], let statusKeyFromFirst = statusDictFromFirst["name"] , let statusDictFromSecond = secondObject["status"] as? [String: String], let statusKeyFromSecond = statusDictFromSecond["name"]  else {
            return false
        }
        return statusKeyFromFirst > statusKeyFromSecond
    }

        print("getAllData : \(getAllData)")
        self.tableView.reloadData()
    }
}

И в tableView показать данные без каких-либо if else условий для хороших и плохих.Теперь сверху будут поступать все данные good status и после этого bad status.

Также узнайте о completion callbacks.Это помогает в async operations как получение API ответа и обновление пользовательского интерфейса после получения ответа.

...