Несколько просмотров в одном viewController
Можно ли иметь один pickerView
в быстром, который меняет свое значение в зависимости от нажатой кнопки. Я не мог найти способ реализовать более одного параметра через 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
}
}
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()
Всякий раз, когда вам нужно изменить источник данных для DatePicker, убедитесь, что после этого вы вызываете метод
picker.reloadAllComponents()
Возьмите флаг и используйте соответствующий источник данных.
Вы можете иметь два массива для заполнения сборщика, как это
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]
}
}
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]
}
Допустим, вы добавили 2 PickerView к вашему представлению - установите тег 1-го средства выбора как 1 & 2 для 2-го средства выбора в Инспекторе атрибутов - CTRL + перетащите от каждого средства выбора до верхнего желтого значка View Controller и выберите dataSource.Repeate выбирая делегата - повторите то же самое для другого средства выбора - добавьте представление выбора и представление выбора в свой класс 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])" } }
Надеюсь, это поможет.
Держите отдельный массив и поместите в него свой массив в соответствии с вашей логикой. Используйте этот массив в окне выбора. Попробуй это:
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
}