您可以使用簡單的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 []
}
}
}
...
即時得到一個錯誤「無法將類型'[String]'的返回表達式轉換爲返回類型'String?' 「在getArrayForRow(row)嵌套在titleForRow中 –
答案是錯誤的。它甚至不應該編譯。數組返回的地方是一個字符串。 ' - > String!'也沒有意義。 – shallowThought
我更新了答案。實際上它的返回類型是String,並且返回一個String數組。它是一種錯字。我沒有編譯這個在Xcode或工具它只是我的估計答案給你們的方向 – iProgrammer