Я не могу загрузить данные из базы данных для отображения результатов UIPickerView - PullRequest
0 голосов
/ 28 мая 2019

Я не могу загрузить данные из базы данных для отображения результатов UIPickerView.Я тестирую по значению массива исправлений UIPicker могу загрузить данные в pickerView, но когда я использую массив загрузки, json UIPickerViewDataSource не может загрузить в окне выбора

может загрузить

var team = ["Apple", "Banana", "Tomato", "Corn", "Bean", "Orange", "Mango", "Mangoteen"]

Canot Load

var team: [AnyObject] = []


import UIKit

class getAllTeamViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate, UITextFieldDelegate {

var selectValue: String?

@IBOutlet weak var showSelectValuePickerView: UITextField!

// Array
    //var team = ["Apple", "Banana", "Tomato", "Corn", "Bean", "Orange", "Mango", "Mangoteen"]
    var team: [AnyObject] = []

//Function getValue from database
func getvalue() -> Void {
    //get the values from sql/Json
    let url = NSURL(string: "http://www.test.com/myWebService/getteamPickView.php")

    let data = NSData(contentsOf: url! as URL)
    var jsonResponse = try! JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSArray
        jsonResponse = jsonResponse.reversed() as NSArray
        reloadInputViews()
        print("jsonResponse ==> \(jsonResponse)")

    for candidate in jsonResponse {
        if let cdict = candidate as? NSDictionary {
            //fullName is the column name in sql/json
            let names = cdict["NameTeam"]
            self.selectValue?.append(((names! as AnyObject) as! String))
            print("Names ==> \(String(describing: names))")
        }//if
    }//for
}//getvalue

//  Picker View Function
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    let titleRow = (team[row] )
    return titleRow as? String
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if team.count > 0 && team.count >= row{
        self.showSelectValuePickerView.text = self.team[row] as? String 
        self.showSelectValuePickerView.isHidden = true
    }
}

}

1 Ответ

0 голосов
/ 28 мая 2019

Извините, это действительно плохой код. Есть так много плохих практик.

  • Не объявляйте массив как [AnyObject], если он явно [String].
    Это позволяет избежать ужасных типов, таких как names! as AnyObject) as! String
  • Не используйте NSData, NSURL, NSArray, NSDictionary в Swift. Используйте нативные типы.
  • .mutableContainers не имеет смысла в Swift, пропустите весь параметр.
  • Никогда синхронно загружать данные с удаленного URL с помощью Data(contentsOf.
  • Перезагрузка пользовательского интерфейса всегда в основном потоке.
  • Обработка всех ошибок! По крайней мере, print их.

Ошибка возникает из-за того, что вы вызываете reloadInputViews() - который, как я полагаю, перезагружает представление выбора - перед заполнением массива источника данных.

И вместо заполнения массива источника данных team вы добавляете строки к selectValue, что не имеет смысла.

Это слегка оптимизированная версия вашего кода

@IBOutlet weak var showSelectValuePickerView: UITextField!

var team = [String]()

//Function getValue from database
func getvalue() {
    //get the values from sql/Json
    let url = URL(string: "http://www.test.com/myWebService/getteamPickView.php")!
    let task = URLSession.shared.dataTask(with: url) { (data, _ , error) in
        if let error = error { print(error); return }
        do {
            if let jsonResponse = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] {
                self.team = jsonResponse.compactMap{ $0["NameTeam"] as? String }
                DispatchQueue.main.async {
                    self.reloadInputViews()
                }
            } else { print("JSON is not an array") }
        } catch { print(error) }
    }
    task.resume()
}

//  Picker View Function
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

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

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    self.showSelectValuePickerView.text = self.team[row]
    self.showSelectValuePickerView.isHidden = true // Are you serious ??? This hides the text field
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...