Невозможно использовать два UIPickerViews на одном viewcontroller - PullRequest
0 голосов
/ 26 апреля 2019

В настоящее время у меня есть контроллер представления с 3 текстовыми полями:

customerTextField

manufacturerTextField

modelTextField

При выборе factoryTextField мне требуется UIPicker, связанный с https://www.example.com/example/Manufacturer.php.

У этого UIPicker есть два столбца, которые заполняются данными JSON. При выполнении выбора UIPicker заполняет и manufacturerTextField, и modelTextField

Когда пользователь выбирает customerTextField, я бы хотел, чтобы UIPickerView отображал данные из https://www.example.com/example/customer.php

Это должен быть только выбор из одного столбца.

ОБНОВЛЕННЫЙ ПРОБЛЕМА:

Ниже приводится то, что у меня сейчас есть, по какой-то причине при выборе customerTextField UIPicker с двумя столбцамиприходит с данными изготовителя TextField.

    import UIKit

class CreateRMA_ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {



        @IBOutlet weak var customerTextField: UITextField!
        @IBOutlet weak var manufacturerTextField: UITextField!
        @IBOutlet weak var modelTextField: UITextField!

        var selectedTextField = UITextField()

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

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

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    selectedTextField = textField
    pickerView.isHidden = false
    return true
}

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        if selectedTextField == customerTextField {
            return 1
        } else if selectedTextField == manufacturerTextField {
            return selectedCategory == nil ? 1 : 2
        } else {//modelTextField
            return 2
        }
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if selectedTextField == customerTextField {
            return values.count
        } else if selectedTextField == manufacturerTextField {
            return component == 0 ? allCategories.count : selectedCategory?.items.count ?? 0
        } else {//modelTextField
            return selectedCategory?.items.count ?? 0
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if selectedTextField == customerTextField {
            return values[row] as? String
        } else if selectedTextField == manufacturerTextField {
            if component == 0 {
                return allCategories[row].name
            } else {
                return selectedCategory?.items[row]
            }
        } else {//modelTextField
            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]
        }
    }







    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }


        override func viewDidLoad() {
            super.viewDidLoad()

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






            //get the values from sql/Json
            let url = NSURL(string: "https://www.example.com/test/service.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)


                }
            }

            if let url = URL(string: "https://www.example.com/test/Make_Model.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()
            }
    }



}

1 Ответ

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

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

@IBOutlet weak var customerTextField: UITextField!
@IBOutlet weak var manufacturerTextField: UITextField!
@IBOutlet weak var modelTextField: UITextField!
var selectedTextField = UITextField()

Назначить выделенное текстовое поле этому временному текстовому полю в textFieldShouldBeginEditing

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    selectedTextField = textField
    pickerView.reloadAllComponents()
    pickerView.isHidden = false
    return true
}

И проверьте, какое текстовое поле выбрано в источнике данных представления выбора, и делегируйте методы и используйте соответствующий источник данных.

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    if selectedTextField == customerTextField {
        return 1
    } else if selectedTextField == manufacturerTextField {
        return selectedCategory == nil ? 1 : 2
    } else {//modelTextField
        return 2
    }
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    if selectedTextField == customerTextField {
        return values.count
    } else if selectedTextField == manufacturerTextField {
        return component == 0 ? allCategories.count : selectedCategory?.items.count ?? 0
    } else {//modelTextField
        return selectedCategory?.items.count ?? 0
    }
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if selectedTextField == customerTextField {
        return values[row] as? String
    } else if selectedTextField == manufacturerTextField {
        if component == 0 {
            return allCategories[row].name
        } else {
            return selectedCategory?.items[row]
        }
    } else {//modelTextField
        return selectedCategory?.items[row]
    }
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if selectedTextField == customerTextField {
        customerTextField.text = values[row] as? String
    } else if selectedTextField == manufacturerTextField {
        if component == 0 {
            selectedCategory = allCategories[row]
            manufacturerTextField.text = allCategories[row].name
            pickerView.reloadAllComponents()
        } else {
            selectedItem = selectedCategory?.items[row]
            modelTextField.text = selectedCategory?.items[row]
        }
    } else {//modelTextField
        modelTextField.text = selectedCategory?.items[row]
    }
}
...