Milhouse83
Milhouse83

Reputation: 13

Swift 4.2 - PickerView not showing Content

this code makes me really mad. I already read thousands of tutorials and stack overflow comments....

Please help me. The Picker just contains a blank grey screen.

Code here:

GenderPickerModel.swift

    import UIKit

class GenderPickerModel:  NSObject, UIPickerViewDataSource, UIPickerViewDelegate {

    let genderPickerData: [String] = ["male", "female"]

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1;
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return genderPickerData.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return genderPickerData[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    } 
}

and used in a Controller:

@IBOutlet weak var gender: UITextField!  
private var genderPickerView: UIPickerView?

override func viewDidLoad() {
        super.viewDidLoad()
        loadProfile()
        prepareView()
    }

    func prepareView() {
        genderPickerView = UIPickerView.init()

        let gpModel = GenderPickerModel()

        genderPickerView?.delegate = gpModel
        genderPickerView?.dataSource = gpModel
        gender.inputView = genderPickerView;
        genderPickerView?.selectRow(0, inComponent: 0, animated: true)
        genderPickerView?.reloadAllComponents()
    }

Upvotes: 0

Views: 858

Answers (1)

Abhishek Jadhav
Abhishek Jadhav

Reputation: 706

First, you do not need to do the separate array of gender in pickerview class and you don't need to create the instance of pickerview.

From this, you can see your datasource in your custompickerview

/**
Controller code where you can create instantiate picker assign data 

*/
    class ViewController: UIViewController {

        @IBOutlet weak var textField: UITextField!            
        let genderPickerData : [String] = ["male", "female"]

        override func viewDidLoad() {
            super.viewDidLoad()

            prepareView()
        }

        func prepareView() {

            genderPickerView = UIPickerView()

            let gpModel = GenderPickerModel()

            gpModel.data = genderPickerData

            gpModel.dataSource = gpModel
            gpModel.delegate = gpModel
            textField.inputView = gpModel

        }
    }

/**

Custom pickerview class where you can handle data 

*/
import UIKit

class GenderPickerModel: UIPickerView, UIPickerViewDataSource, UIPickerViewDelegate {

    var data = [String]()

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return data.count
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return data[row]
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    }

}

Upvotes: 3

Related Questions