2017-09-04 2 views
0

Ich suchte sehr, aber ich fand keine Antwort auf meine Frage. Meine App sollte die Daten einer Auswahl ändern, nachdem die andere Auswahl geändert wurde.Ändern von Daten von UIPickerView Swift

Wie Sie sehen können, möchte ich in der titleForRow-Methode die Daten einstellen und ich weiß auch, dass diese Methode nur einmal aufgerufen wird, aber ich weiß nur nicht wo und wie ich es dann auch machen soll.

Ich denke, auf der didSelectRow-Methode konnte ich auch die Daten einstellen, aber da habe ich keinen Schimmer wie ich es machen soll.

Hier ist mein Code, ich hoffe, das ist hilfreich.

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource { 
    var x = 0 
    @IBOutlet weak var leaguePicker: UIPickerView! 
    @IBOutlet weak var clubPicker: UIPickerView! 
    let league = ["Bundesliga", "Premier League"] 
    let club = [["ManCity", "Arsenal"],["Bayern", "Dortmund"]] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     leaguePicker.delegate = self 
     leaguePicker.dataSource = self 
     clubPicker.delegate = self 
     clubPicker.dataSource = self 
    } 

    func numberOfComponents(in picker: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(_ picker: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
    { 
     switch (picker){ 
      case leaguePicker: 
       return league.count 
      case clubPicker: 
       return club.count 
      default: 
       return 1 
     } 
    } 

    func pickerView(_ picker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     switch (picker){ 
      case leaguePicker: 
       return league[row] 
      case clubPicker: 
       if (x==0){ 
        print("titleForRow call.. x=0") 
        return club[0][row] 
        // this is just happening at the beginning 
       } else { 
        print("titleForRow call.. x=1") 
        return club[1][row] 
        // this does not happen 
       } 
      default: return "an error occurred" 
     } 
    } 

    func pickerView(_ picker: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    { 
     if (picker == leaguePicker) { 
      if (row==0){ 
       //clubPicker.selectRow(0, inComponent: 0, animated: true) 
       x=0 
      } else { 
      x=1 // this call is working 
      //clubPicker.selectRow(0, inComponent: 1, animated: true) 
      } 
     } 
    picker.reloadAllComponents() 
    //this does not lead to call titleForRow 
    } 
} 

Antwort

0

Sie müssen den 2. Picker neu laden, wenn sich der Wert in der 1. Auswahl ändert.

func pickerView(_ picker: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
{ 
    if (picker == leaguePicker) { 
     x = row 
     clubPicker.reloadAllComponents() 
    } 
} 

Sie müssen auch fix die numberOfRowsInComponent:

func pickerView(_ picker: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
{ 
    switch (picker){ 
     case leaguePicker: 
      return league.count 
     case clubPicker: 
      return club[x].count 
     default: 
      return 1 
    } 
} 

Und Ihre titleForRow vereinfacht werden:

func pickerView(_ picker: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
    switch (picker){ 
     case leaguePicker: 
      return league[row] 
     case clubPicker: 
      return club[x][row] 
     default: return "an error occurred" 
    } 
} 

Ich schlage vor, Sie auch Ihre x Variable etwas nützlicher umbenannt wie selectedLeague.