0

So I've been trying to setup several pickerviews as keyboards for different textfields in this TableViewController I setup. I got to the point where when I click on the TextFields that I want to have the pickerview on, the it opens a pickerview keyboard but there is no info in it, and when I click on the normal textfields it doesn't open the keyboards at all can someone please help me with this.

import UIKit

class AddProductTableViewController: UITableViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    @IBOutlet weak var productPicker: UITextField!
    @IBOutlet weak var unitCost: UITextField!
    @IBOutlet weak var total: UITextField!
    @IBOutlet weak var City: UITextField!
    @IBOutlet weak var statePicker: UITextField!
    @IBOutlet weak var date: UITextField!
    @IBAction func datePicker(sender: UITextField) {

        let datePickerView: UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)

    }

    var productPickerOption = []

    var statePickerOption = []

    override func viewDidLoad() {
        super.viewDidLoad()

        productPickerOption = ["Diesel","Gas"]
        let productPickerView = UIPickerView()
        productPickerView.delegate = self
        productPicker.inputView = productPickerView

        statePickerOption = ["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI","MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"]
        let statePickerView = UIPickerView()
        statePickerView.delegate = self
        statePicker.inputView = statePickerView

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        //the number of compontes(or "columns") that the picker view should display
        return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        //the number rows for the component
        if(pickerView.tag == 1) {
            return productPickerOption.count
        }else if(pickerView.tag == 2){
            return statePickerOption.count
        }else{
            return 0
        }
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        //the title of the picker view
        if(pickerView.tag == 1) {
            return "\(productPickerOption[row])"
        }else if(pickerView.tag == 2) {
            return "\(statePickerOption)"
        }else {
            return nil
        }
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if(pickerView.tag == 1){
            productPicker.text = productPickerOption[row] as? String
        }else if(pickerView.tag == 2){
            statePicker.text = statePickerOption[row] as? String
        }
    }
}
Dharmesh Kheni
  • 71,228
  • 33
  • 160
  • 165
Ozvengrad
  • 302
  • 5
  • 10

1 Answers1

1

Just add this in your viewDidLoad method:

productPickerView.dataSource = self
statePickerView.dataSource = self

Also add a tag into both your pickerView this way:

productPickerView.tag = 1
statePickerView.tag = 2 

And your code looks like:

import UIKit

class SecondTableViewController: UITableViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    @IBOutlet weak var productPicker: UITextField!
    @IBOutlet weak var unitCost: UITextField!
    @IBOutlet weak var total: UITextField!
    @IBOutlet weak var city: UITextField!
    @IBOutlet weak var statePicker: UITextField!
    @IBOutlet weak var date: UITextField!
    @IBAction func datePicker(sender: UITextField) {

        let datePickerView: UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = UIDatePickerMode.Date
        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: Selector("datePickerValueChanged:"), forControlEvents: UIControlEvents.ValueChanged)

    }

    var productPickerOption = []

    var statePickerOption = []

    override func viewDidLoad() {
        super.viewDidLoad()

        productPickerOption = ["Diesel","Gas"]
        let productPickerView = UIPickerView()
        productPickerView.delegate = self
        productPickerView.dataSource = self
        productPickerView.tag = 1
        productPicker.inputView = productPickerView

        statePickerOption = ["AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI","MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"]
        let statePickerView = UIPickerView()
        statePickerView.delegate = self
        statePickerView.dataSource = self
        statePickerView.tag = 2
        statePicker.inputView = statePickerView

    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        //the number of compontes(or "columns") that the picker view should display
        return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        //the number rows for the component
        if(pickerView.tag == 1) {
            return productPickerOption.count
        }else if(pickerView.tag == 2){
            return statePickerOption.count
        }else{
            return 0
        }
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        //the title of the picker view
        if(pickerView.tag == 1) {
            return "\(productPickerOption[row])"
        }else if(pickerView.tag == 2) {
            return "\(statePickerOption[row])"  //add [row] here
        }else {
            return nil
        }
    }

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if(pickerView.tag == 1){
            productPicker.text = productPickerOption[row] as? String
        }else if(pickerView.tag == 2){
            statePicker.text = statePickerOption[row] as? String
        }
    }
}
Dharmesh Kheni
  • 71,228
  • 33
  • 160
  • 165