How do I use multiple picker views with different data sources in the same view?

后端 未结 3 1938
孤城傲影
孤城傲影 2020-12-18 09:06

I have a view with three picker views in it. Two of the picker views have the same data, an array with the numbers 1 to 100. The third picker view has an array with a list

3条回答
  •  甜味超标
    2020-12-18 09:33

    As an alternate way of doing that you can use only one picker view and to do the same thing.

    @IBOutlet weak var inputBank: UITextField!    
    @IBOutlet weak var inputBranch: UITextField! // Those 2 are the fields I need to set the picker view
    
    
    @IBOutlet weak var inputAccountNumber: UITextField! // this is an extra textField
    
    private var availableBankDetails: AvailableBankDetails?
    private var pickerBanks: [String]?
    private var pickerBranches: [String]?
    private var pickerView: UIPickerView
    
    private var profileDomain: ProfileDomain
    
    required init?(coder aDecoder: NSCoder) {
        self.profileDomain = ProfileDomain()
        self.pickerView = UIPickerView()
        super.init(coder: aDecoder)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.pickerView.delegate = self
        createBankPickerView()
        createBranchPickerView()
    }
    
    private func loadAvailableBankDetails(completion: @escaping (Bool) -> ()) {
        profileDomain.getAvailableBanks { (boolResponse, jsonResponseBody) in
            if boolResponse {
                self.availableBankDetails = AvailableBankDetails(availableBankDetails: jsonResponseBody)
                self.pickerBanks = self.availableBankDetails!.getAvailableBankDetails()
                completion(true)
            } else {
                self.view.makeToast(jsonResponseBody["message"].stringValue, duration: 3, position: .bottom, title: "Error")
                completion(false)
            }
    
        }
    }
    
    private func loadAvailableBranchDetails(bankName: String) -> [String] {
        pickerBranches = availableBankDetails?.getAvailableBranches(bank: bankName)
        return (availableBankDetails?.getAvailableBranches(bank: bankName))!
    }
    
    private func createBankPickerView() {
        loadAvailableBankDetails { (boolResponse) in
            if boolResponse {
                self.pickerView.selectRow(1, inComponent: 0, animated: true)
                self.inputBank.inputView = self.pickerView
                self.pickerView.backgroundColor = UIColor.lightGray
                self.createToolbar(inputBankOrBranch: self.inputBank)
            } else {
                print("error")
            }
        }
    
    }
    
    private func createBranchPickerView() {
        self.pickerView.selectRow(1, inComponent: 0, animated: true)
        self.inputBranch.inputView = self.pickerView
        self.pickerView.backgroundColor = UIColor.lightGray
        self.createToolbar(inputBankOrBranch: self.inputBranch)
    }
    
    func createToolbar(inputBankOrBranch: UITextField) {
      let toolbar = UIToolbar()
      toolbar.sizeToFit()
      toolbar.tintColor = UIColor.darkGray
      toolbar.backgroundColor = UIColor.blue
      let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(self.closePickerView))
      toolbar.setItems([doneButton], animated: false)
      toolbar.isUserInteractionEnabled = true
      inputBankOrBranch.inputAccessoryView = toolbar
    }
    
    @objc func closePickerView() {
        view.endEditing(true)
    }
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (inputBank.isFirstResponder) {
            return pickerBanks!.count
        } else{
            if pickerBranches == nil {
                return 0
            }
            return pickerBranches!.count
        }
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if (inputBank.isFirstResponder){
            return pickerBanks![row]
        } else {
            return pickerBranches![row]
        }
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if inputBank.isFirstResponder {
            inputBank.text =  pickerBanks![row]
            inputBranch.text = ""
            self.pickerBranches = loadAvailableBranchDetails(bankName: inputBank.text!)
        } else {
            if pickerBranches == nil {
                inputBranch.text = ""
            } else {
                inputBranch.text = pickerBranches![row]
            }
        }        
    }
    
    func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
        return 100.0
    }
    
    func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
        return 60.0
    }
    
    func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
    
    
        var label:UILabel
    
        if let v = view as? UILabel{
            label = v
        }
        else{
            label = UILabel()
        }
    
        label.textColor = UIColor.black
        label.textAlignment = .left
        label.font = UIFont(name: "Helvetica", size: 16)
    
    
    
        if inputBank.isFirstResponder {
            label.text = pickerBanks![row]
        } else {
            label.text = pickerBranches![row]
        }
    
        return label
    }
    

提交回复
热议问题