Несколько видов выбора в одном viewController

Возможно ли иметь один pickerView в Swift, который меняет свое значение в зависимости от нажатой кнопки. Я не мог найти способ реализовать более одного параметра через pickerView в одном ViewController. Альтернативное решение, такое как dropdown menu, тоже подойдет. Пример/функциональный код был бы отличным, если бы он был предоставлен. Это для приложения-викторины, которое будет принимать несколько параметров.

введите здесь описание изображения

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {

@IBOutlet weak var pickerView: UIPickerView!
@IBOutlet weak var selectionBtn: UIButton!

let animals = ["Lion", "Dog", "Monkey", "Cat", "Bat"]

override func viewDidLoad() {

    pickerView.isHidden = true

    pickerView.delegate = self
    pickerView.dataSource = self

    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

@IBAction func selectPressed(_ sender: UIButton) {

    if pickerView.isHidden {
        pickerView.isHidden = false
    }
}

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

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

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

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

    selectionBtn.setTitle(animals[row], for: .normal)
    pickerView.isHidden = true


}

}

person Anshul Shah    schedule 19.04.2018    source источник
comment
используйте разные массивы, чем animals, когда вы нажимаете кнопку, используйте другой набор этого и перезагружайте сборщик, который будет работать   -  person Lu_    schedule 19.04.2018


Ответы (6)


Да, имея более 1 источника данных

let animals1 = ["Lion", "Dog", "Monkey", "Cat", "Bat"]

let animals2 = ["Lion", "Dog", "Monkey", "Cat", "Bat"]

var mainData = [String]()

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

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

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

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

   selectionBtn.setTitle(mainData[row], for: .normal)
   pickerView.isHidden = true

 }

назначьте mainData сказать animal1

и перезагрузить

pickerView.reloadAllComponents()
person Sh_Khan    schedule 19.04.2018

Сохраните отдельный массив и поместите в него свой массив в соответствии с вашей логикой. Используйте этот массив в pickerview. Попробуй это:

let animals = ["Lion", "Dog", "Monkey", "Cat", "Bat"]
let secondAnimals = ["Lion1", "Dog1", "Monkey1", "Cat1", "Bat1"]
let pickerArray = [String]()

@IBAction func selectPressed(_ sender: UIButton) {
    pickerArray = animals  //change it according to your logic
    pickerView.reloadAllComponents()
    pickerView.isHidden = !pickerView.isHidden
}

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

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

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

    selectionBtn.setTitle(pickerArray[row], for: .normal)
    pickerView.isHidden = true


}
person Arnab    schedule 19.04.2018

У вас может быть два массива для заполнения сборщика, как это

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{

        if numb == 1
        {
          return firstArray.count
        }
        else

           return secondArray.count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {


        if numb == 1
        {
           return firstArr[row]
        }
        else
        {
           return secondArr[row]
        }
    }
person Catherine    schedule 19.04.2018

Всякий раз, когда вам нужно изменить источник данных для datepicker, убедитесь, что после этого вы вызываете метод

picker.reloadAllComponents()

Возьмите флаг и используйте соответствующий источник данных.

person Manish Mahajan    schedule 19.04.2018
comment
Это не качественный ответ. Уже есть много ответов с дополнительной информацией. - person TheTiger; 19.04.2018

скажем, вы добавили 2 PickerView в свое представление - установите тег 1-го средства выбора как 1 и 2 для 2-го средства выбора в Инспекторе атрибутов - CTRL + перетащите из каждого средства выбора на верхний желтый значок контроллера представления. и выберите dataSource. Повторите тот же выбор делегата - повторите вышеописанное и для другого сборщика - добавьте pickerview и pickerviewdelegation в свой класс ViewController:

class ViewController: UIViewController,UIPickerViewDataSource,UIPickerViewDelegate {
  • в вашем классе ViewController создайте пустые массивы для сборщиков:

    var picker1Options = []
    var picker2Options = []
    
  • в методе viewDidLoad() заполните массивы своим содержимым:

    picker1Options = ["p1 1","p1 2","p1 3","p1 4","p1 5"]
    picker2Options = ["p2 1","p2 2","p2 3","p2 4","p2 5"]
    
  • реализовать методы делегата и выбора:

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if (pickerView.tag == 1){
            return picker1Options.count
        }else{
            return picker2Options.count
        }
    }
    
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
        if (pickerView.tag == 1){
            return "\(picker1Options[row])"
        }else{
            return "\(picker2Options[row])"
        }
    }
    

Надеюсь, это поможет.

person Aleem    schedule 19.04.2018

let arrAny : [String] = [String]()

button действие:

@IBAction func btn2Pressed(_ sender: UIButton) {
    arrAny = ["Lion1", "Dog1", "Monkey1", "Cat1", "Bat1"]
    if pickerView.isHidden {
         pickerView.isHidden = false
    }
}

@IBAction func btn1Pressed(_ sender: UIButton) {
     arrAny = ["Lion", "Dog", "Monkey", "Cat", "Bat"]
     if pickerView.isHidden {
          pickerView.isHidden = false
     }
}

pickerView делегат:

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

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

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return arrAny[row]
}
person Divya Thakkar    schedule 19.04.2018