Получить индекс компонента, выбранного в UIPickerView Xcode Swift - PullRequest
0 голосов
/ 24 октября 2018

пожалуйста, прости мое невежество.Я учусь практически с нуля.

Я пытаюсь заполнить несколько экземпляров pickerView на основе выбора pickerView в верхней части представления.Я хочу, чтобы варианты выбора, отображаемые в остальных видах сборщика, зависели от того, какой элемент был выбран в первом просмотре сборщика.

У меня всего 6 представлений сборщика.1-й делает общий выбор, на котором я хочу основывать остаток.

Pickerview1 состоит из 4 компонентов.Если пользователь выбирает компонент 4, все остальные pickerViews показывают варианты выбора.Если пользователь выбирает компонент 2 или 3, я хочу, чтобы pickerView 4 и 5 отображали N / A, а остальные показывают варианты.Если пользователь выбирает компонент 1, я хочу, чтобы pickerViews 3-5 отображал N / A, в то время как 1-2 показывают варианты выбора.

Я предполагаю, что для этого мне понадобится значение индекса выбранного компонента в pickerView1, чтобысделать оператор if else для func pickerView (_ pickerView: UIPickerView, numberOfRowsInComponent и т. д.

Я нашел в документации selectedRow (inComponent :), но не смог найти рабочие примеры того, как его реализовать, в моемcase.

К настоящему моменту прилагаются некоторые фрагменты моего кода: import UIKit

class FirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {func numberOfComponents (в pickerView: UIPickerView)}> Int {return

    var capacities = ["6","9","12","15","18","24"]
    var notUsed = "N/A"
    var oduList = ["MXZ-2C20", "MXZ-3C24", "MXZ-3C30", "MXZ-5C42"]
    var result:Float = 0.0
    var one4num:Float = 1.0
    var factor:Float = 1.08
    var per5ft:Float = 5
    var factory:Float = 98

    var selectedRow = 1

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        selectedRow = pickerView.selectedRow(inComponent: index)
        if pickerView == oduPicker {
            return oduList.count
        }
        else if pickerView == idu1PickerView {
            return capacities.count
        }
        else if pickerView == idu2PickerView {
            return capacities.count
        }
        else if pickerView == idu3PickerView {
            return capacities.count
        }
        else if pickerView == idu4PickerView {
            return capacities.count
        }
        else {
            return capacities.count
        }
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == oduPicker {
            return oduList[row]
        }
        else if pickerView == idu1PickerView {
            return capacities[row]
        }
        else if pickerView == idu2PickerView {
            return capacities[row]
        }
        else {
            return capacities[row]
        }
    }
    @IBOutlet weak var oduPicker: UIPickerView!

    @IBOutlet weak var idu1PickerView: UIPickerView!
    @IBOutlet weak var idu2PickerView: UIPickerView!
    @IBOutlet weak var idu3PickerView: UIPickerView!
    @IBOutlet weak var idu4PickerView: UIPickerView!
    @IBOutlet weak var idu5PickerView: UIPickerView!

    @IBOutlet weak var one4Label: UILabel!
    @IBOutlet weak var one4Slider: UISlider!



    @IBOutlet weak var output: UILabel!




    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.oduPicker.delegate = self
        self.oduPicker.dataSource = self
        self.idu1PickerView.delegate = self
        self.idu1PickerView.dataSource = self
        self.idu2PickerView.delegate = self
        self.idu2PickerView.dataSource = self
        self.idu3PickerView.delegate = self
        self.idu3PickerView.dataSource = self
    }

    @IBAction func one4Slider(_ sender: Any) {
        one4Label.text = "\(one4Slider.value)"
    }
    @IBAction func three8Slider(_ sender: Any) {
        three8Label.text = "\(three8Slider.value)"


    }
    @IBAction func calculateButton(_ sender: Any) {
        result = factor*(one4num-factory)/per5ft
        output.text = "\(result)"
    }
}

Если я реализую предложение следующим образом:

import UIKit

class FirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}

var capacities = ["6","9","12","15","18","24"]
var notUsed = ["N/A"]
var oduList = ["MXZ-2C20", "MXZ-3C24", "MXZ-3C30", "MXZ-5C42"]
var result:Float = 0.0
var one4num:Float = 1.0
var factor:Float = 1.08
var per5ft:Float = 5
var factory:Float = 98

var rowSelected: Int?


func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView == oduPicker{
        self.rowSelected = row
        // make anything
    }

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

    if pickerView == oduPicker {
        return oduList.count
    }
    else if pickerView == idu1PickerView {
        return capacities.count
    }
    else if pickerView == idu2PickerView {

        return capacities.count
    }
    else if pickerView == idu3PickerView {
        if rowSelected!  < 2 {
            return 1
        }
        else {
            return capacities.count
        }
    }
    else if pickerView == idu4PickerView {
        if rowSelected! < 3 {
            return 1
        }
        else {
            return capacities.count
        }
    }
    else {
        if rowSelected! < 4 {
            return 1
        }
        else {
            return capacities.count
        }
    }
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView == oduPicker {
        return oduList[row]
    }
    else if pickerView == idu1PickerView {
        return capacities[row]
    }
    else if pickerView == idu2PickerView {
        return capacities[row]
    }
    else if pickerView == idu3PickerView {
        if rowSelected! < 2 {
            return notUsed[row]
        }
        else {
            return capacities[row]
        }
    }
    else if pickerView == idu4PickerView {
        if rowSelected! < 3 {
            return notUsed[row]
        }
        else {
            return capacities[row]
        }
    }
    else if pickerView == idu5PickerView {
        if rowSelected! < 4 {
            return notUsed[row]
        }
        else {
            return capacities[row]
        }
    }
    else {
        return capacities[row]
    }
}



@IBOutlet weak var oduPicker: UIPickerView!

@IBOutlet weak var idu1PickerView: UIPickerView!
@IBOutlet weak var idu2PickerView: UIPickerView!
@IBOutlet weak var idu3PickerView: UIPickerView!
@IBOutlet weak var idu4PickerView: UIPickerView!
@IBOutlet weak var idu5PickerView: UIPickerView!

@IBOutlet weak var one4Label: UILabel!
@IBOutlet weak var one4Slider: UISlider!



@IBOutlet weak var output: UILabel!




override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.oduPicker.delegate = self
    self.oduPicker.dataSource = self
    self.idu1PickerView.delegate = self
    self.idu1PickerView.dataSource = self
    self.idu2PickerView.delegate = self
    self.idu2PickerView.dataSource = self
    self.idu3PickerView.delegate = self
    self.idu3PickerView.dataSource = self
    self.idu4PickerView.delegate = self
    self.idu4PickerView.dataSource = self
    self.idu5PickerView.delegate = self
    self.idu5PickerView.dataSource = self
}

@IBAction func one4Slider(_ sender: Any) {
    one4Label.text = "\(one4Slider.value)"
}

@IBAction func calculateButton(_ sender: Any) {
    result = factor*(one4num-factory)/per5ft
    output.text = "\(result)"
}
}

Код нарушает «FirstViewController» и, по-видимому, делает недействительными операторы «numberOfRows» и «titleForRows» кака также каскад ошибок ниже этого.

Если я реализую после этих двух функций:

 else {
        return capacities[row]
    }
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView == oduPicker{
        self.rowSelected = row
        // make anything
    }



@IBOutlet weak var oduPicker: UIPickerView!

@IBOutlet weak var idu1PickerView: UIPickerView!
@IBOutlet weak var idu2PickerView: UIPickerView!
@IBOutlet weak var idu3PickerView: UIPickerView!
@IBOutlet weak var idu4PickerView: UIPickerView!
@IBOutlet weak var idu5PickerView: UIPickerView!

Он ломает все переменные pickerView, такие как oduPicker и т. Д.

Если я пытаюсь вывести оператор в 1-ю функцию следующим образом:

var rowSelected: Int?



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

    if pickerView == oduPicker {
        self.rowSelected = row
        return oduList.count
    }
    else if pickerView == idu1PickerView {
        return capacities.count
    }...

Снова ломается«FirstViewController» с ошибкой «Тип« FirstViewController »не соответствует протоколу« UIPickerViewDataSource »»

Я также вынужден поставить «!» после «rowSelected» для упаковки / развертывания.Я не уверен, что это означает или важно в данный момент.

Обновление:

Если я реализую по предложению Самуила как таковой:

import UIKit

классFirstViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {func numberOfComponents (в pickerView: UIPickerView) -> Int {return 1}

var capacities = ["6","9","12","15","18","24"]
var notUsed = ["N/A"]
var oduList = ["MXZ-2C20", "MXZ-3C24", "MXZ-3C30", "MXZ-5C42"]
var result:Float = 0.0
var one4num:Float = 1.0
var factor:Float = 1.08
var per5ft:Float = 5
var factory:Float = 98

var selectedRow = 1



func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    selectedRow = pickerView.selectedRow(inComponent: index)
    if pickerView == oduPicker {
        return oduList.count
    }
    else if pickerView == idu1PickerView {
        return capacities.count
    }
    else if pickerView == idu2PickerView {

        return capacities.count
    }
    else if pickerView == idu3PickerView {
        if selectedRow  < 2 {
            return 1
        }
        else {
            return capacities.count
        }
    }
    else if pickerView == idu4PickerView {
        if selectedRow < 3 {
            return 1
        }
        else {
            return capacities.count
        }
    }
    else {
        if selectedRow < 4 {
            return 1
        }
        else {
            return capacities.count
        }
    }
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView == oduPicker {
        return oduList[row]
    }
    else if pickerView == idu1PickerView {
        return capacities[row]
    }
    else if pickerView == idu2PickerView {
        return capacities[row]
    }
    else if pickerView == idu3PickerView {
        if selectedRow < 2 {
            return notUsed[row]
        }
        else {
            return capacities[row]
        }
    }
    else if pickerView == idu4PickerView {
        if selectedRow < 3 {
            return notUsed[row]
        }
        else {
            return capacities[row]
        }
    }
    else if pickerView == idu5PickerView {
        if selectedRow < 4 {
            return notUsed[row]
        }
        else {
            return capacities[row]
        }
    }
    else {
        return capacities[row]
    }
}




@IBOutlet weak var oduPicker: UIPickerView!

@IBOutlet weak var idu1PickerView: UIPickerView!
@IBOutlet weak var idu2PickerView: UIPickerView!
@IBOutlet weak var idu3PickerView: UIPickerView!
@IBOutlet weak var idu4PickerView: UIPickerView!
@IBOutlet weak var idu5PickerView: UIPickerView!

@IBOutlet weak var one4Label: UILabel!
@IBOutlet weak var one4Slider: UISlider!



@IBOutlet weak var output: UILabel!




override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.oduPicker.delegate = self
    self.oduPicker.dataSource = self
    self.idu1PickerView.delegate = self
    self.idu1PickerView.dataSource = self
    self.idu2PickerView.delegate = self
    self.idu2PickerView.dataSource = self
    self.idu3PickerView.delegate = self
    self.idu3PickerView.dataSource = self
    self.idu4PickerView.delegate = self
    self.idu4PickerView.dataSource = self
    self.idu5PickerView.delegate = self
    self.idu5PickerView.dataSource = self
}

@IBAction func one4Slider(_ sender: Any) {
    one4Label.text = "\(one4Slider.value)"
}

@IBAction func calculateButton(_ sender: Any) {
    result = factor*(one4num-factory)/per5ft
    output.text = "\(result)"
}

}

Я получаю ошибку после строки:

selectedRow = pickerView.selectedRow(inComponent: index)

"Невозможно преобразовать значение типа '(Any) -> Int' в ожидаемый тип аргумента 'Int'"

1 Ответ

0 голосов
/ 24 октября 2018

Вы можете использовать методы делегата.Метод ниже может помочь вам.Параметр row определяет строку, выбранную пользователем.Вы можете попробовать:

var rowSelected : Int?

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    if pickerView == idu1PickerView {
       self.rowSelected = row
       // make anything
    }
    ...
}

Если у вас есть только один компонент, вы можете использовать метод, который вы написали:

var selectedRow = pickerView.selectedRow(inComponent: 0)
...