2017-02-18 4 views
1

Я нашел этот ответ How do I setup a second component with a UIPickerView, и это было полезно, но я хочу сделать больше. Я хочу, чтобы данные второго компонента зависели от первого. Вот мой кодUIPickerView несколько компонентов в swift

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) 
} 


} 

Я хочу firstArray, который будет отображаться во втором компоненте, если «3х3» в данный момент выбран в первом компоненте и secondArray если «2х2» выбран. Как бы Вы это сделали? спасибо за любую помощь заранее!

ответ

-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 [] 
    } 
} 
+0

Im получаю ошибку " Невозможно преобразовать возвращаемое выражение типа '[String]', чтобы вернуть тип 'String?' "в getArrayForRow (строка), вложенная внутри titleForRow –

+1

Ответ неверный. Он даже не компилируется. Массив s возвращается туда, где ожидается String. '-> String!' Также не имеет смысла. – shallowThought

+0

Я обновил ответ. На самом деле его возвращаемым типом является String и я возвращаю массив строк. Это своего рода опечатка. Я не компилировал это на xcode или не использовал его только мой оцененный ответ, чтобы дать вам парни указания – iProgrammer

-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) 
     } 
    } 
} 

Как и в случае положения очень похожи, теперь вы можете реорганизовать их в дополнительный метод:

... 
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 [] 
     } 
    } 
} 
...