ios - 获取 UIPickerView Xcode Swift 中所选组件的索引

标签 ios swift uipickerview

请原谅我的无知。我正在从头开始学习。

我正在尝试根据 View 顶部的 pickerView 选择来填充多个 pickerView 实例。我希望剩余的选取器 View 中显示的选项取决于第一个选取器 View 中选择的项目。

我总共有 6 个 pickerView。第一个做出了我想要作为其余部分基础的一般选择。

Pickerview1 有 4 个组件。如果用户选择组件 4,则所有剩余的 pickerViews 将显示选择。如果用户选择组件 2 或 3,我希望 pickerView 4 和 5 显示 N/A,而其他组件显示选择。如果用户选择组件 1,我希望 pickerViews 3-5 显示 N/A,而 1-2 显示选择。

我假设要这样做,我需要 pickerView1 中所选组件的索引值来为 func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent 等创建 if else 语句。

我在文档中找到了 selectedRow(inComponent:) 但无法找到如何在我的案例中实现它的工作示例。

附件是到目前为止我的代码的一些片段: 导入 UIKit

类FirstViewController:UIViewController,UIPickerViewDelegate, UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { 返回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 {
            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 等。

如果我尝试将语句带入第一个函数,如下所示:

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’不符合协议(protocol)‘UIPickerViewDataSource’”

我还被迫加了一个“!”在“rowSelected”之后进行包装/展开。我不确定这是否意味着什么,或者目前是否重要。

更新:

如果我按照塞缪尔的建议实现:

import UIKit

类FirstViewController:UIViewController,UIPickerViewDelegate,UIPickerViewDataSource { func numberOfComponents(in pickerView: UIPickerView) -> Int { 返回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’”

最佳答案

您可以使用委托(delegate)的方法。下面的方法可以帮助你。 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)

关于ios - 获取 UIPickerView Xcode Swift 中所选组件的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52973583/

相关文章:

ios - UIScrollView 内的 UIStackView,增长到最大高度然后滚动

swift - 选择 TableView 行时出现奇怪的显示行为

iphone - 如何实现如图所示的 UIPickerView,并带有组件标题?

objective-c - 您能在这段代码中看到什么错误吗? 'Cause I can’ t,但仍然无法正常工作

iphone - UIPickerView 如何处理 2 个以上的转盘旋转?

ios - setContentOffset 从 ScrollView 的底部开始不起作用

ios - UITextField 中的 WKWebView 自动完成建议

ios - 为什么 awakeFromNib 从 TableView 中的 Cell 调用两次?

ios - 无法从 Localizable.strings 文件中检索本地化字符串

ios - 自定义 Unwind Segue 在 Swift 中因 NSException 而崩溃