如何在一个View Controller中使用2个UIPickerView?

dom*_*999 25 xcode uipickerview swift

我在一个View Controllers中有2个UIPickerController.我可以让一个工作,但当我添加一秒钟,我的应用程序崩溃.这是我用于一个选择器视图的代码:

import UIKit

class RegisterJobPosition: UIViewController, UIPickerViewDelegate {

    @IBOutlet weak var positionLabel: UILabel!

    var position = ["Lifeguard", "Instructor", "Supervisor"]

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func numberOfComponentsInPickerView(PickerView: UIPickerView!) -> Int
    {
        return 1
    }

    func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int
    {
        return position.count
    }

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

    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {        
        positionLabel.text = position[row]
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我怎样才能让第二个控制器工作?说我的第二个PickerView被调用UIPickerController(另一个被调用location).我尝试在PickerView方法中复制代码,position但它不起作用.

我正在使用Swift.

LAO*_*RTS 67

这是我的解决方案: - 在故事板上,将2 PickerView添加到您的视图中 - 将第一个选择器标记设置为属性检查器下第二个选择器的#1和#2 - CTRL +从每个选择器拖动到顶部黄色视图控制器图标并选择dataSource.重复相同的选择委托 - 重复上面的其他选择器 - 将pickerview和pickerviewdelegation添加到您的ViewController类:

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
Run Code Online (Sandbox Code Playgroud)
  • 在ViewController类中,为拾取器创建空数组:

    var picker1Options = []
    var picker2Options = []
    
    Run Code Online (Sandbox Code Playgroud)
  • 在viewDidLoad()方法中,使用您的内容填充数组:

    picker1Options = ["Option 1","Option 2","Option 3","Option 4","Option 5"]
    picker2Options = ["Item 1","Item 2","Item 3","Item 4","Item 5"]
    
    Run Code Online (Sandbox Code Playgroud)
  • 实现delegate和pickerview方法:

    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])"
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

享受,享受乐趣,用积极的信号表达你的快乐.

  • Lazar K这是一个非常可恶的评论.它并不简单也不复杂.这只是一个不同的策略.在Android上,你会(或应该)为不同的Spinners使用不同的适配器.实际上你也可以在iOS上使用不同的数据源和代理.我实际上会在答案中建议这一点 (4认同)
  • 感谢您的标签建议,这对我使用多个选择器确实有很大帮助。我现在已经解决了。 (2认同)

and*_*oft 26

根据我在问题中的信息,我要说你需要设置数据源和委托方法来处理区分哪个选择器实例正在调用它们的能力.

在选择器视图上使用tag属性是一种策略.

方法中应该有一些if/else或switch语句具有不同的逻辑,具体取决于它是被引用的位置还是位置选择器.

  • 关于 if/else 语句,我怎样才能使变量成为告诉要使用的位置或位置选择器的值? (2认同)

小智 5

我发现这行得通。

class SecondViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var textbox1: UILabel!
    @IBOutlet weak var textbox2: UILabel!

    @IBOutlet weak var dropdown1: UIPickerView!
    @IBOutlet weak var dropdown2: UIPickerView!

    var age = ["10-20", "20-30", "30-40"]
    var Gender = ["Male", "Female"]

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        var countrows : Int = age.count
        if pickerView == dropdown2 {
            countrows = self.Gender.count
        }

        return countrows
    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == dropdown1 {
            let titleRow = age[row]
             return titleRow
        } else if pickerView == dropdown2 {
            let titleRow = Gender[row]
            return titleRow
        }

        return ""
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView == dropdown1 {
            self.textbox1.text = self.age[row]
        } else if pickerView == dropdown2 {            
            self.textbox2.text = self.Gender[row]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)