Зависимый выбор с использованием UIPickerView на третьей кнопке - PullRequest
0 голосов
/ 20 июня 2020

Я хочу, чтобы button3 отображал элементы с помощью uipickerview на основе выбора button2. button3 будет зависеть от button2.

[«Круглый»: [«X», «Y», «Z»]]

[«Квадрат»: [«X», «Y» , «Z»], «Овал»: [«A», «B», «C»], «Прямоугольник»: [«1», «2», «3»]]

[«Вырезанный треугольник»: [«X», «Y», «Z»], «Сфера»: [«A», «B», «C»]]

Вот текущий xcode скрипт:

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {


@IBOutlet weak var textField_0: UITextField!
@IBOutlet weak var textField_1: UITextField!
@IBOutlet weak var textField_2: UITextField!
@IBOutlet weak var btn1: UIButton!
@IBOutlet weak var btn2: UIButton!
@IBOutlet weak var btn3: UIButton!
@IBOutlet weak var mainPicker: UIPickerView!


private var shapeOptions = ["Option 1", "Option 2", "Option 3"]

private var shape1 = [["Round"],
    ["Square", "Oval", "Rectangle"],
    ["Triangle", "Sphere"]]

private var shape2 = [["X", "Y", "Z"],
    ["A", "B", "C"],
    ["1", "2", "3"]]

private var _currentSelection: Int = 0

var currentSelection: Int {
    get {
        return _currentSelection
    }
    set {
        _currentSelection = newValue
        mainPicker.reloadAllComponents()

        textField_0.text = shapeOptions[_currentSelection]
        textField_1.text = shape1[_currentSelection][0]
        textField_2.text = shape2[_currentSelection][0]
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        currentSelection = 0;
    }

    @IBAction func btn1Clicked(_ sender: Any) {
        mainPicker.delegate = self
        mainPicker.dataSource = self
        mainPicker.tag = 0
        mainPicker.isHidden = false
    }

    @IBAction func btn2Clicked(_ sender: Any) {
        mainPicker.delegate = self
        mainPicker.dataSource = self
        mainPicker.tag = 1
        mainPicker.isHidden = false
    }

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView.tag == 0 {
            return shapeOptions.count
        } else if pickerView.tag == 1 {
            return shape1[currentSelection].count
        } else {
            return shape2[currentSelection].count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 0 {
            return shapeOptions[row]
        } else if pickerView.tag == 1 {
            return shape1[currentSelection][row]
        } else {
            return shape2[currentSelection][row]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 0 {
            currentSelection = row
            textField_0.text = shapeOptions[row]
            textField_0.resignFirstResponder()
        } else if pickerView.tag == 1 {
            textField_1.text = shape1[currentSelection][row]
            textField_1.resignFirstResponder()
        } else {
            textField_2.text = shape2[currentSelection][row]
            textField_2.resignFirstResponder()
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 22 июня 2020

@ rs7 Мне удалось получить от кого-то ответ, это тот ответ, который я искал:

private var shapeOptions = ["Option 1", "Option 2", "Option 3"]

private var shape = [["Round"],
    ["Square", "Oval", "Rectangle"],
    ["Triangle", "Sphere"]]

private var sizeA:[[String]] = [["X", "Y", "Z"]]
private var sizeB:[[String]] = [["A", "B", "C"]]
private var sizeC:[[String]] = [["1", "2", "3"]]

    private var sizes:[[[String]]]?
 

    var currentTypeSelection: Int? {
        didSet{
            mainPicker.reloadAllComponents()
        }
    }

    var currentSizeSelection: Int? {
        didSet{
            mainPicker.reloadAllComponents()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.sizes = [sizeA, sizeB, sizeC]

        currentTypeSelection = 0;
        currentSizeSelection = 0;
    }
    
    @IBAction func btn1Clicked(_ sender: Any) {
        mainPicker.delegate = self
        mainPicker.dataSource = self
        mainPicker.tag = 0
        mainPicker.isHidden = false
    }
    
    @IBAction func btn2Clicked(_ sender: Any) {
        mainPicker.delegate = self
        mainPicker.dataSource = self
        mainPicker.tag = 1
        mainPicker.isHidden = false
    }
    
    @IBAction func btn3Clicked(_ sender: Any) {
        mainPicker.delegate = self
        mainPicker.dataSource = self
        mainPicker.tag = 2
        mainPicker.isHidden = false
    }
    
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView.tag == 0 {
            return shapeOptions.count
        } else if pickerView.tag == 1 {
            return shape[currentTypeSelection!].count
        } else {
            return sizes![currentTypeSelection!][currentSizeSelection!].count
        } 
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 0 {
            return shapeOptions[row]
        } else if pickerView.tag == 1 {
            return shape[currentTypeSelection!][row]
        } else {
            return sizes![currentTypeSelection!][currentSizeSelection!][row]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 0 {
            currentTypeSelection = row
            textField_0.text = shapeOptions[row]
            textField_0.resignFirstResponder()
            currentSizeSelection = 0
        } else if pickerView.tag == 1 {
            currentSizeSelection = row
            textField_1.text = shape[currentTypeSelection!][row]
            textField_1.resignFirstResponder()
        } else {
            textField_2.text = sizes![currentTypeSelection!][currentSizeSelection!][row]
            textField_2.resignFirstResponder()
        }
    }
0 голосов
/ 20 июня 2020

Пара вещей:

  • В вашем коде отсутствует функция Button3.
  • Вам не нужно устанавливать делегат / источник данных pickerview каждый раз, когда вы нажимаете кнопку.
  • Если я правильно понимаю, что вы хотите, вам не нужно отображать pickerView каждый раз, когда вы нажимаете кнопку. Просто покажите это, когда вы нажмете первую кнопку.
  • Я не уверен, что делают текстовые поля, но подумайте о перемещении кода текстового поля внутри функций кнопок.
  • Я изменил ваш код ниже. Вы хотите перезагрузить pickerView только при нажатии кнопки для подтверждения выбора. То, что вы делали в своем коде, перезагружало pickerView каждый раз, когда пользователь менял выбор средства выбора.
  • (необязательно) Вместо использования тегов у вас может быть переменная pickerViewIndex с блоком didSet, который перезагружает pickerView. И внутри функций, вместо того, чтобы присваивать значение для pickerView.tag, вы должны назначить значение для pickerViewIndex.

    var currentSelection: Int {
    get {
        return _currentSelection
    }
    set {
        _currentSelection = newValue
        // Consider moving the code below to the buttons functions
        textField_0.text = shapeOptions[_currentSelection]
        textField_1.text = shape1[_currentSelection][0]
        textField_2.text = shape2[_currentSelection][0]
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        currentSelection = 0;

        mainPicker.delegate = self
        mainPicker.dataSource = self

    }

    @IBAction func btn1Clicked(_ sender: Any) {
        mainPicker.tag = 0
        mainPicker.isHidden = false
        mainPicker.reloadAllComponents()
    }

    @IBAction func btn2Clicked(_ sender: Any) {
        mainPicker.tag = 1
        mainPicker.reloadAllComponents()
    }

    @IBAction func btn3Clicked(_ sender: Any) {
        mainPicker.tag = 2
        mainPicker.reloadAllComponents()
    }

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView.tag == 0 {
            return shapeOptions.count
        } else if pickerView.tag == 1 {
            return shape1[currentSelection].count
        } else {
            return shape2[currentSelection].count
        }
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView.tag == 0 {
            return shapeOptions[row]
        } else if pickerView.tag == 1 {
            return shape1[currentSelection][row]
        } else {
            return shape2[currentSelection][row]
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView.tag == 0 {
            currentSelection = row
            textField_0.text = shapeOptions[row]
            textField_0.resignFirstResponder()
        } else if pickerView.tag == 1 {
            currentSelection = row
            textField_1.text = shape1[currentSelection][row]
            textField_1.resignFirstResponder()
        } else {
            currentSelection = row
            textField_2.text = shape2[currentSelection][row]
            textField_2.resignFirstResponder()
        }
    }

...