Search code examples
iosswiftuiviewpicker

iOS - how to set picker data when I use uiview to uiviewcontroller


hello guys I'm trying to make some util that I need like Pokedex kk

but I have some problem. I make the picker in separate view and I call that view in tabview and use it.

but I don't know how to set the data. If I make picker in uiviewcontroller I can set data in didload? method but in uiview there are no didload method that I can set.

this is my code

SelectPoke.swift

class SelectPoke: UIView , UIPickerViewDelegate , UIPickerViewDataSource{
@IBOutlet var textField: UITextField!

var data =  ["1","2","3"]
var picker = UIPickerView()

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

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    textField.text = data[row]
}

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

func h(){
    picker.delegate = self
    picker.dataSource = self
}

override func awakeFromNib() {
    h()
}

class func instanceFromNib() -> UIView {
    return UINib(nibName: "SelectPoke", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView
}

}

Tab1ViewController.swift

class Tab1ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()


    let sideView = SelectPoke.instanceFromNib()
    sideView.frame = self.view.frame

    self.view.addSubview(sideView)
}

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

}

plz help me. my Pokemon is waiting..


Solution

  • Typically, you would not subclass UIPickerView, but create a view in a Storyboard (or XIB-file) and connect the delegate and data source with the Tab1ViewController.

    Nevertheless, in this code we'll just create a new UIPickerView in viewDidLoad, to keep the code similar to the original question

    Remark: Currently I have no Xcode running, so there might be small syntactial errors in this code example

     class Tab1ViewController: UIViewController, UIPickerViewDelegate , UIPickerViewDataSource {
    
        var data =  ["1","2","3"]
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let sideView = UIPickerView()
            sideView.frame = self.view.frame
    
            self.view.addSubview(sideView)
            sideView.delegate = self
            sideView.dataSource = self
    
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        public func numberOfComponents(in pickerView: UIPickerView) -> Int {
            return 1
        }
    
        public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{
            return data.count
        }
    
        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            textField.text = data[row]
        }
    
        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
            return data[row]
        }
    }