UIPickerView在swift中的多个组件

时间:2017-02-18 14:58:59

标签: swift uipickerview

我找到了这个答案How do I setup a second component with a UIPickerView,这很有帮助,但我想做更多。我想让第二个组件的数据依赖于第一个组件。这是我的代码

class timerScreen: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
// where all the outlets are setup
@IBOutlet weak var pickerViewOutlet: UIPickerView!
// where I try to set up all my variables and constants
let cubesToWorkWith = ["3X3", "2X2", "4X4", "5X5", "6X6", "7X7", "Skewb", "Square-One"]
let firstArray = ["cross", "OLL", "Pll", "Corners", "Edges"]
let SecondArray = ["OLL" "Pll"]

// where the picker view is set up.
func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 2
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return cubesToWorkWith.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return cubesToWorkWith[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    cubeSelected = Int16(row)
}


}

如果当前在第一个组件中选择了“3X3”,则我希望firstArray显示在第二个组件中;如果选择“2X2”,则希望第二个阵列显示在第二个组件中。你会怎么做? 感谢您提前帮助!!!

2 个答案:

答案 0 :(得分:-1)

尝试这样做。我不知道你到底想要什么。但似乎您想要在第一个组件的行选择上重新加载组件。如果这是要求,则此代码将起作用。

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

func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    //row = [repeatPickerView selectedRowInComponent:0];
    var row = pickerView.selectedRowInComponent(0)
    println("this is the pickerView\(row)")

    if component == 0 {
        return cubesToWorkWith.count
    }
    else {
        return firstArray.count
    }
}

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

    if component == 0 {
        return cubesToWorkWith[row]
    } else {
        return getArrayForRow(row)[row]
    }
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
     if component == 0 {
          pickerView.reloadComponent(1)
     }
}

func getArrayForRow(row: Int) -> [String] {
    switch row { // check if 2*2 0r 3*3 
    case 0:
        return firstArray
    case 1:
        return secondArray
    // and so on...
    default:
        return []
    } 
}

答案 1 :(得分:-1)

您可以使用简单的if / elseswitch案例来选择正确的数组:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {        
    if component == 0 {
        return cubesToWorkWith[row]
    } else {
        if cubesToWorkWith[lastSelectedCube] == "3X3" {
            return firstArray[row]
        } else if cubesToWorkWith[lastSelectedCube] == "2X2" {
            return secondArray[row]
        } else /* You did not mention what to show for other selections, that would be handled here */ {
            return "undefined"
        }
    }
}

您可以将其复制到numberOfRowsInComponent并返回数组的count

完整代码:

class timerScreen: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    // where all the outlets are setup
    @IBOutlet weak var pickerViewOutlet: UIPickerView!
    // where I try to set up all my variables and constants
    let cubesToWorkWith = ["3X3", "2X2", "4X4", "5X5", "6X6", "7X7", "Skewb", "Square-One"]
    let firstArray = ["cross", "OLL", "Pll", "Corners", "Edges"]
    let secondArray = ["OLL", "Pll"]
    var lastSelectedCube = 0
    // where the picker view is set up.
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 2
    }

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

        if component == 0 {
            return cubesToWorkWith.count
        } else {
            if cubesToWorkWith[lastSelectedCube] == "3X3" {
                return firstArray.count
            } else if cubesToWorkWith[lastSelectedCube] == "2X2" {
                return secondArray.count
            } else /* You did not mention what to show for other selections, that would be handled here */ {
                return 0
            }
        }
    }

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

        if component == 0 {
            return cubesToWorkWith[row]
        } else {
            if cubesToWorkWith[lastSelectedCube] == "3X3" {
                return firstArray[row]
            } else if cubesToWorkWith[lastSelectedCube] == "2X2" {
                return secondArray[row]
            } else /* You did not mention what to show for other selections, that would be handled here */ {
                return "undefined"
            }
        }
    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if component == 0 {
            lastSelectedCube = row
            pickerView.reloadComponent(1)
        }
    }
}

因为if子句看起来非常相似,所以现在可以用额外的方法重构它们:

...
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {        
    let contentArray = content(for: component)

    return contentArray.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    let contentArray = content(for: component)

    if row >= contentArray.count {
        return nil
    }

    return contentArray[row]
}

func content(for component: Int) -> [String] {
    if component == 0 {
        return cubesToWorkWith
    } else {
        if cubesToWorkWith[lastSelectedCube] == "3X3" {
            return firstArray
        } else if cubesToWorkWith[lastSelectedCube] == "2X2" {
            return secondArray
        } else /* You did not mention what to show for other selections, that would be handled here */ {
            return []
        }
    }
}
...