Каков наилучший способ заполнить представление выбора с JSON данных в Swift? - PullRequest
1 голос
/ 25 апреля 2020

Я создаю трекер приложений COVID-19 на IOS.

Чтобы отобразить данные по стране, я построил окно выбора выбора, которое будет содержать все названия стран.

, благодаря HTTP-Cal, мне удалось получить данные JSON т.е. название каждой страны. в идеале я должен sh добавить каждое значение в массив, который, в свою очередь, заполнит pickerView.

Возможно ли это? Если да, как бы я это сделал?

Я также открыт для других способов сделать это. Вот мой код:

 @IBOutlet weak var confirmedCasesLabel: UILabel!
 @IBOutlet weak var deathsLabel: UILabel!
 @IBOutlet weak var recoveriesLabel: UILabel!

 //MARK: - Relevant variables
 private let covidUrl: String = "https://corona-api.com/countries"
 var countryArray: [String] = [String]()


 override func viewDidLoad() {
     super.viewDidLoad()

     // Do any additional setup after loading the view.
     countryPickerView.delegate = self
     countryPickerView.dataSource = self

     //
     httpCall()
 }


 /*
 // MARK: - Navigation

 // In a storyboard-based application, you will often want to do a little preparation before navigation
 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
     // Get the new view controller using segue.destination.
     // Pass the selected object to the new view controller.
 }
 */

 //MARK: - Functions that handles picker view delegates and data source
 func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
     return countryArray.count
    }

 func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
     return countryArray[row]
 }

 //MARK: - HTTP CALL - GET COUNTRY DATA
 func httpCall() {
     request(covidUrl, method: .get).responseJSON { (response) in
         if response.result.isSuccess {
             //test just print some data
             let dataJSON: JSON = JSON(response.result.value)
             //print(dataJSON)
             //on va identifier chaque pays + l'ajouter au tableau des pays
//                let countryNameJSON = dataJSON["data"][99]["name"]
//                print(countryNameJSON)
             for country in 0...99 {
                 let countryNameJSON = dataJSON["data"][country]["name"].stringValue
                 print(countryNameJSON)
                 //on ajoute ce nom au tabeleau de pays
                 //self.countryArray.append(countryNameJSON)
             }

         }
     }
 }



}

1 Ответ

0 голосов
/ 25 апреля 2020

Создайте структуру, соответствующую протоколу Decodable, и добавьте необходимые атрибуты

struct Country: Decodable {
    var name: String?
}
  • Создайте массив Country типа объекта с именем countryArray в своем классе
  • Выполнить HTTP-вызов
  • Получить данные с сервера
  • Анализировать и загружать в countryArray объект, используя JSONDecoder
  • Перезагрузить countryPickerView после анализа

Пожалуйста, следуйте примеру ниже

class YourClass {

    @IBOutlet weak var countryPickerView: UIPickerView!

    var countryArray = [Country]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        countryPickerView.delegate = self
        countryPickerView.dataSource = self
        httpCall()
    }


    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return countryArray.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return countryArray[row].name
    }

    //MARK: - HTTP CALL - GET COUNTRY DATA
    func httpCall() {
        request(covidUrl, method: .get).responseJSON { (response) in
            if response.result.isSuccess {
                let countryArray = try JSONDecoder().decode([Country].self, from: #yourJsonData#)
                countryPickerView.reloadAllComponents()
            }
        }
    }

}

Поскольку объект Country соответствует протоколу Decodable, анализ будет выполняться без циклов, если Struct соответствует вашему JSON схема.

...