我找到了这个答案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”,则希望第二个阵列显示在第二个组件中。你会怎么做? 感谢您提前帮助!!!
答案 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
/ else
或switch
案例来选择正确的数组:
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 []
}
}
}
...