2017-10-10 6 views
0

J'ai ici 2 sélecteurs et les valeurs des images sont assignées aux données qui sont tirées de la base de feu. Il est affecté à un tableau, puis ces valeurs sont affectées au sélecteur. Cela ne fonctionne pas et je ne suis pas vraiment sûr pourquoi. Voici mon code:Le sélecteur ne reçoit pas les données de la matrice qui est tirée de la base de feu

import UIKit 
import Firebase 
import FirebaseDatabase 
class SearchSelectVC: UIViewController, UIPickerViewDelegate , UIPickerViewDataSource{ 

    @IBOutlet weak var locationPicker: UIPickerView! 
    @IBOutlet weak var datePicker: UIPickerView! 
    @IBOutlet weak var locationLB: UILabel! 
    @IBOutlet weak var dateLB: UILabel! 

    var locData: [String] = [String]() 
    var dateData : [String] = [String]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     initPickers() 
     getLoc(onCompletion: { (data) in 
      print(data) 
      self.locData = (data) 
      print(self.locData) 
     }) 
    } 


    func getDate(onCompletion: @escaping ([String]) ->()) { 
     var data : [String] = [] 
     let selectedLoc = locationLB.text 
     var dateRef: DatabaseReference! 
     dateRef = Database.database().reference().child("launch").child((selectedLoc)!) 
     dateRef.observe(.value) { (snapshot) in 
      for child in snapshot.children { 
       let snap = child as! DataSnapshot 
       let key = snap.key 
       data.append(key) 
       print("date = \(key)") 
       //print(data) 

      } 
      onCompletion(data) 
     } 
    } 
    func getLoc(onCompletion: @escaping ([String]) -> Void){ 
     print("here3") 
     var data : [String] = [] 
     var locRef: DatabaseReference! 
     locRef = Database.database().reference() 
     print("here4") 
     locRef.child("launch").observe(.value) { snapshot in 
      for child in snapshot.children { 
       let snap = child as! DataSnapshot 
       let key = snap.key 
       data.append(key) 
       print("location = \(key)") 
       //print(data) 


      } 
      onCompletion(data) 
     } 

    } 
    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     if(pickerView == locationPicker){ 
      return 1 
     } 
     else if(pickerView == datePicker){ 
      return 1 
     } 
     return 1 
    } 

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

      return locData.count 
     } 
     else if (pickerView == datePicker) { 

      return dateData.count 
     } 
     return 1 
    } 
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     if (pickerView == locationPicker) { 
      return locData[row] 
     } 
     else if(pickerView == datePicker){ 
      return dateData[row] 
     } 
     return "thisisbad" 
    } 
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) 
    { 
     if(pickerView == locationPicker){ 
      updateLabelLoc() 
      getDate(onCompletion: { (data) in 
       print(data) 
       self.dateData = data 
      }) 
     } 
     else if(pickerView == datePicker){ 
      updateLabelDate() 
     } 
    } 
    func updateLabelLoc(){ 
     let location = locData[locationPicker.selectedRow(inComponent: 0)] 
     locationLB.text = location 
    } 
    func updateLabelDate(){ 
     let date = dateData[datePicker.selectedRow(inComponent: 0)] 
     dateLB.text = date 
    } 
    func initPickers(){ 
     locationPicker.delegate = self 
     locationPicker.dataSource = self 
     datePicker.delegate = self 
     datePicker.dataSource = self 
    } 

} 

Les données sont dans un gestionnaire d'achèvement et à la fin, il renvoie les données de la base de données correctement. Les sélecteurs s'affichent sans aucune donnée à l'intérieur d'eux. Merci!

Répondre

0

créer:

func updatePickers() { 
    locationPicker.reloadAllComponents() 
    datePicker.reloadAllComponents() 
} 

Après la print(self.locData) (en getLoc(onCompletion:) (en viewDidLoad()), mis:

self.updatePickers() 
+0

Merci beaucoup –

+0

Laissez-moi savoir si cela fonctionne Votre gestionnaire d'achèvement est. probablement terminé après avoir chargé tous les éléments sur l'écran.Vous devez donc mettre à jour le mainUI après que vos données ont fini de charger.Cela devrait faire l'affaire.Vous devrez peut-être ajouter cela à vos autres fermetures dans votre code – Causaelity

+0

Que faites-vous signifie b y d'autres fermetures, désolé je suis nouveau à Swift, et la programmation en général. –