UIPickerView - 条件显示

时间:2016-09-01 03:18:15

标签: ios swift uipickerview user-experience

我是swift的新手,对UIPickerView有疑问。

我创建了两个挑选视图

一个有值 - A,B,C,F

两个有值 - B,C,D,E

我现在想要在这两个选择器视图中实现逻辑。

逻辑是,如果在第一个选择器视图中选择了B和C,那么第二个选择器视图将没有B和C供用户选择。我怎么能做到这一点?

我是一个快速的初学者,所以任何提示都会受到赞赏。

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var Picker1: UIPickerView!

    @IBOutlet weak var Picker2: UIPickerView!
    @IBOutlet weak var label: UILabel!

    var savedVal1 = "" as String
    var savedVal2 = "" as String

    var Array = ["A", "B", "C", "F"]
    var Array2 = ["B", "C", "D", "E"]

    var PlacementAnswer = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        Picker1.delegate = self
        Picker1.dataSource = self
        Picker1.tag = 1

        Picker2.delegate = self
        Picker2.dataSource = self
        Picker2.tag = 2
    }

    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        if pickerView == Picker1
        { return Array[row] }
        else if pickerView == Picker2
        { return Array2[row] }
        return ""
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        if pickerView == Picker1
        { return Array.count }
        else if pickerView == Picker2
        { return Array2.count }
        return 1
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

        return 1
    }
}

2 个答案:

答案 0 :(得分:0)

使用以下内容为pickerView实施选择委托功能:

var array3 = Array2 //Create a copy of Array 2

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    //Check if picker is picker1 and the chosen value is "B" or "C"
    if pickerView == Picker1 {
        if Array[row] == "B" || Array[row] == "C" {
            //Check if "B" and "C" is available
            if let index = Array2.indexOf(Array[row]) {
                //Remove it from Picker2 datasource array and reload it
                Array2.removeAtIndex(index)
                Picker2.reloadAllComponents()
            }
        }
        else {
            //If choose another option other than "B" and "C", revert back to the first array
            Array2 = array3
            Picker2.reloadAllComponents()
        }
    }
}

老实说,你应该阅读关于Swift代码的发明,变量应该是小写的,而不是大写的

答案 1 :(得分:0)

当用户不会对实际发生的事情感到困惑时,其中一种方法是不从选择器中删除项目。而是向他展示你真正的意思,他会更好地理解在某些组合中没有选项。解决方案可以更简单。

描述:用户从第一个选择器中选择B或C.然后,如果选择了第二个选择器中的B或C,则跳转到下一个可用选项。 此外,我们可以更改不可用的行颜色。

//REMOVED METHOD - not able to change title color
/*func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if pickerView == Picker1
    { return Array[row] }
    else if pickerView == Picker2
    { return Array2[row] }
    return ""
}*/

//ADDED METHOD - for styling of your UIPickerView title
func pickerView(_ pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {

    let string = pickerView == Picker1 ? Array[row] : Array2[row]

    if (pickerView == Picker2 && (row == 1 || row == 2)) {
        return NSAttributedString( // gray row, when B or C in Picker2
            string: string,
            attributes: [NSForegroundColorAttributeName: UIColor.gray]
        )
    }

    return NSAttributedString( // common row
        string: string,
        attributes: nil)
}

//UPDATED METHOD - to reset second picker if user selects B or C from the second picker
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if (pickerView == Picker1 && (row == 1 || row == 2)) {
        print("You selected B or C in first PickerView")
    } else if (pickerView == Picker2 && (row == 0 || row == 1)) {
        // if already set B or C in first Picker, and user has selected B or C in second picker,
        // jump to the next available option
        Picker2.selectRow(3, inComponent: 0, animated: true)
    }
}