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!
Merci beaucoup –
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
Que faites-vous signifie b y d'autres fermetures, désolé je suis nouveau à Swift, et la programmation en général. –