Отображение второго столбца в UIPickerView из JSON с использованием того, что выбрано из первого столбца - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть JSON-сценарий со следующей структурой:

[{"manufacturer”:”exampleManufacturer”,”model":"exampleModel”}]

В настоящее время у меня есть следующая настройка UIPickerView, которая отображает первый столбец manufacturer. Как я могу отобразить второй столбец model в том же UIPickerView?

Второй столбец зависит от того, что выбрано для первого столбца, поэтому он должен перезагрузиться.

Ниже показано, как я покажу первый столбец manufacturer:

import UIKit

class CreateRMA_ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {



        @IBOutlet weak var customerTextField: UITextField!


    var pickerView: UIPickerView!
    var values: [AnyObject] = []

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        return self.values.count

    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {


        let titleRow = (values[row] as? String)!
        return titleRow


    }

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


        if values.count > 0 && values.count >= row{
            self.customerTextField.text = self.values[row] as? String
            self.pickerView.isHidden = true
        }

    }




    func textFieldDidBeginEditing(_ textField: UITextField) {
        //when you select the text field the picker view will be visible

        if(textField == self.customerTextField){
            self.pickerView.isHidden = false
            self.view.endEditing(true)
        }

    }



    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }


        override func viewDidLoad() {
            super.viewDidLoad()

            pickerView = UIPickerView()
            pickerView.dataSource = self
            pickerView.delegate = self


            //get the values from sql/Json
            let url = NSURL(string: "https://www.example.com/test/test.php")

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


            for candidate in tmpValues {
                if let cdict = candidate as? NSDictionary {

                    //fullName is the column name in sql/json
                    let names = cdict["customer"]
                    self.values.append(names! as AnyObject)


                }
            }
    }

}

Пример JSON:

[{"manufacturer":"GE","model":"1147"},{"manufacturer":"GE","model":"34983"},{"manufacturer":"Apple","model":"8Plus"},{"manufacturer":"Samsung","model":"Galaxy 8"},{"manufacturer":"Samsung","model":"Note 5"},{"manufacturer":"Samsung","model":"Note 8"}]

Ответы [ 2 ]

1 голос
/ 25 апреля 2019
class TestViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    struct Category {
        var name: String
        var items: [String]
    }
    var allCategories = [Category]()
    var selectedCategory:Category?
    var selectedItem: String?

    var pickerView: UIPickerView!

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        allCategories = [Category(name: "Fruits", items: ["Apple","Banana"]), Category(name: "Vegetables", items: ["Cucumber","Potato"])]
        pickerView = UIPickerView(frame: CGRect(x: 0, y: 200, width: UIScreen.main.bounds.width, height: 200))
        view.addSubview(pickerView)
        pickerView.dataSource = self
        pickerView.delegate = self


    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return selectedCategory == nil ? 1 : 2
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return component == 0 ? allCategories.count : selectedCategory?.items.count ?? 0
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if component == 0 {
            return allCategories[row].name
        } else {
            return selectedCategory?.items[row]
        }
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if component == 0 {
            selectedCategory = allCategories[row]
            manufacturerTextField.text = allCategories[row].name
            pickerView.reloadAllComponents()
        } else {
            selectedItem = selectedCategory?.items[row]
            modelTextField.text = selectedCategory?.items[row]
        }
    }

}

Редактировать

if let url = URL(string: "https://www.example.com/test/test.php"),
    let data = try? Data(contentsOf: url),
    let tmpValues = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [[String:String]] {
    let tempCategories = tmpValues?.reduce(into: [String:[String]](), { (dict, value) in
        if let manufacturer = value["manufacturer"], let model = value["model"] {
            dict[manufacturer, default:[]].append(model)
        }
    })
    for category in (tempCategories ?? [:]) {
        allCategories.append(Category(name: category.key, items: category.value))
    }
    pickerView.reloadAllComponents()
}

enter image description here

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

Для 2 столбцов в pikcerview используйте 2 в numberOfComponentsInPickerView.

Вы можете следить за этим ответом.

Как настроить второй компонент с помощью UIPickerView

...