ios - 使用从第一列中选​​取的内容在 JSON 的 UIPickerView 中显示第二列

标签 ios swift uipickerview

我有一个具有以下结构的 JSON 脚本:

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

我目前有以下 UIPickerView 设置,它显示第一列 manufacturer如何在同一个 UIPickerView 中显示第二列 model

第二列取决于为第一列选择的内容,因此必须重新加载。

以下是我目前要显示的第一列 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"}]

最佳答案

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

关于ios - 使用从第一列中选​​取的内容在 JSON 的 UIPickerView 中显示第二列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55842188/

相关文章:

ios - 发现信标的最佳测距方式?

iPhoneSimulator 目录中带有 iPhoneSimulator9.3.sdk 的 Swift 无法编译

swift - Swift 中的 Slice 比较逻辑是什么

crash - 选择器 View 上的断言失败

javascript - 使用从 URL 变量读取的 JavaScript 加载不同的 CSS 样式表

objective-c - iOS5、UIScrollView 和 layoutSubviews 行为

ios - pfquery 将 pfobject 传递给另一个 VC

ios - 如何解决 flutter 上的 pod install 错误?

ios - 尝试设置 UIPickerView 的数据源时出错

ios - 即使重新查询后,UIPickerView 也不显示数据