简体   繁体   中英

Make UIPickerView dependent on selected row (Swift)

This is something I want to achieve 在此处输入图片说明

Make Second UIPickerView depend on currently selected row 在此处输入图片说明

1.set dataSource or delegate from storyboard

2.set tag 101 of PickerOne from storyboard.

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

@IBOutlet weak var pickerTwo: UIPickerView!

let pickerOneOptions = ["TV", "RADIO"]
let pickerTwoTVOptions = ["ABC", "SBS"]
let pickerTwoRadioOptions = ["TripleJ", "107.0", "CBS"]
var pickerOneSelectedRow:Int = 0

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

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

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
 if pickerView.tag == 101 { //pickerOne
  return pickerOneOptions.count
 }  else { //pickerTwo
  if self.pickerOneSelectedRow == 0 {
    return pickerTwoTVOptions.count
  } else {
    return pickerTwoRadioOptions.count
  }
 }
}

func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
 if pickerView.tag == 101 { //pickerOne
  return pickerOneOptions[row]
 }  else { //pickerTwo
  if self.pickerOneSelectedRow == 0 {
    return pickerTwoTVOptions[row]
  } else {
    return pickerTwoRadioOptions[row]
  }
 }
return nil
}

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
 if pickerView.tag == 101 {
  self.pickerOneSelectedRow = row
  pickerTwo.reloadAllComponents()
  }
 }
}

Please check UIPickerViewDelegate and UIPickerViewDataSource: https://developer.apple.com/reference/uikit/uipickerviewdelegate https://developer.apple.com/reference/uikit/uipickerviewdatasource

The idea is:

  1. You configure the data of picker2 based on selected row of picker1.

  2. And whenever user selects a row in the picker1 reload the data in picker2

Code below:

class ViewController: UIViewController {

    @IBOutlet weak var picker1: UIPickerView!
    @IBOutlet weak var picker2: UIPickerView!

    let picker1Options = ["TV", "RADIO"]
    let picker2TVOptions = ["ABC", "SBS"]
    let picker2RadioOptions = ["TripleJ", "107.0", "CBS"]

    override func viewDidLoad() {
        super.viewDidLoad()
        self.picker1.dataSource = self
        self.picker1.delegate = self

        self.picker2.dataSource = self
        self.picker2.delegate = self
        // Do any additional setup after loading the view, typically from a nib.
    }

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

And,

extension ViewController: UIPickerViewDataSource, UIPickerViewDelegate
{
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView == self.picker1 {
            return picker1Options.count
        } else if picker1.selectedRow(inComponent: 0) == 0 {
            return picker2TVOptions.count
        }
        else if picker1.selectedRow(inComponent: 0) == 1 {
            return picker2RadioOptions.count
        }
        return 0
    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == picker1 {
            return picker1Options[row]
        } else if picker1.selectedRow(inComponent: 0) == 0 {
            return picker2TVOptions[row]
        }
        else if picker1.selectedRow(inComponent: 0) == 1 {
            return picker2RadioOptions[row]
        }
        return nil
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == picker1 {
            picker2.reloadAllComponents()
        }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM