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
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
}