【问题标题】:Swift Dynamic UIPickerViewSwift 动态 UIPickerView
【发布时间】:2019-02-15 06:10:12
【问题描述】:

我觉得我很接近了,因为下面的代码适用于静态 UIPickerViews,但我正在尝试根据第一个选择动态设置我的pickerview,尽管查看了教程和搜索,但我无法完全解决这个问题。例如,如果您在 myPickerData 中选择“Brown”,则 myPickerData2 中应仅显示“Undergraduate”,或者如果您选择“Dartmouth”,则应仅获得“Undergraduate”和“MBA”,如果选择“Columbia”或“Harvard”则最后,你得到“本科”、“JD”、“MBA”。

var myPickerData = ["Select Your Dream College", “Brown", "Columbia", “Dartmouth”,  "Harvard" ]

var myPickerData2 = ["Undergraduate", "JD", "MBA"]

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

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

    if component == 0 {
        return myPickerData.count
    }

    return myPickerData2.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

    if component == 0 {
        return myPickerData[row] as String
    }
    return myPickerData2[row] as String
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    uniSelected = myPickerData[pickerView.selectedRow(inComponent: 0)]

    collegeSelected = myPickerData2[pickerView.selectedRow(inComponent: 1)]
}

【问题讨论】:

    标签: swift dynamic components uipickerview


    【解决方案1】:

    你可以试试

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    
         if component == 0 {
    
             let str = myPickerData[row]
    
             if str == "Brown" {
    
                myPickerData2 = ["Undergraduate"]
             }
             else if str == "Dartmouth" {
    
                myPickerData2 = ["Undergraduate", "MBA"]
             }
             else {
    
                myPickerData2 = ["Undergraduate", "JD", "MBA"]
    
             }
    
             pickerView.reloadComponent(1)
    
          }
          else {
    
             uniSelected = myPickerData[pickerView.selectedRow(inComponent: 0)]
    
             collegeSelected = myPickerData2[pickerView.selectedRow(inComponent: 1)]
          }
    
    }
    

    //

    这可能包含重复,但您可以尝试一下

    let mainDic:[String:[String]] = ["Select Your Dream College":[],
                     "Brown":["Undergraduate"],
                     "Dartmouth":["Undergraduate", "MBA"],
                     "Columbia":  ["Undergraduate", "JD", "MBA"],
                     "Harvard",["Undergraduate", "JD", "MBA"]]
    

    然后

    myPickerData2 = mainDic[myPickerData[row]]!
    
    pickerView.reloadComponent(1)
    

    并在组件 0 中使用它

    myPickerData = Array(mainDic.keys)
    

    使您的数据源为mainDic,并将键处理为myPickerData,当前选择的键的值为myPickerData2

    编辑:viewDidLoad

    myPickerData = Array(mainDic.keys)
    myPickerData2 = mainDic["Select Your Dream College"]! // it's default or simply []
    

    【讨论】:

    • 这非常有帮助,并且认为这是解决问题的方法。但是,是否有更清洁/可扩展的方法来做到这一点?我只为每个数据源数组列出了 3 个,并想象一个更大的数组将成为一个巨大的 if 语句。 IE,如果我在 myPickerData1 中加载 15 个潜在选择,那么 if else 语句会变得非常混乱。
    • 好的,dict 数组是有道理的,但是我原来的 func 方法有什么变化?试图想象我的原始代码将如何变化。再次感谢!
    • init myPickerDatamyPickerData2mainDic ,,, 见编辑
    • 试图用字典实现你的建议,但遇到了很多问题,所以只使用你原来的 if 语句 haaa
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多