2017-08-20 3 views
0

Ich erstelle eine App, die die Firebase-Datenbank verwendet, um zwei verschiedene untergeordnete Datenbanken in einer Zelle anzuzeigen. Also, da meine erste Kinddatenbank "Name" heißt, wäre es der Haupttext der Zelle, und die zweite Kinddatenbank, "ImageURL", wäre der Untertitel der Zelle.Firebase-Datenbank zu UITableView-Zellenproblemen

Ich bin nicht in der Lage herauszufinden, warum immer wenn ich versuche, die zweite Kind-Datenbank in die Tabellenansicht Zelle zu bekommen, funktioniert es nicht. Ich bekomme entweder einen Index außerhalb des Bereichsfehler, oder die zweite Kinddatenbank wird überhaupt nicht angezeigt.

Hier ist mein Code:

Variablen:

@IBOutlet weak var myTextField: UITextField! 
@IBOutlet weak var myNameField: UITextField! 
@IBOutlet weak var myTableView: UITableView! 

var ref: DatabaseReference! 
var myNameList:[String] = [] 
var myList:[String] = [] 
var handle:DatabaseHandle! 
var nameHandle: DatabaseHandle! 

Knopf-Code, wenn SAVE-Taste gedrückt wird:

@IBAction func saveBtn(_ sender: Any) { 

    if myNameField.text != "" { 
     ref?.child("Name").childByAutoId().setValue(myNameField.text) 
     myNameField.text = "" 

    if myTextField.text != "" { 
      ref?.child("ImageURL").childByAutoId().setValue(myTextField.text) 
      myTextField.text = "" 
     } 
    } 

} 

Tableview Funktion numberOfRowsInSection Code:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return myList.count 
} 

Tableview Funktion CellForRowAtIndexPath Code:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 
    cell.textLabel?.text = myNameList[indexPath.row] 
    cell.detailTextLabel?.text = myList[indexPath.row] 

ViewDidLoad Code:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    ref = Database.database().reference() 
    handle = ref?.child("ImageURL").observe(.childAdded, with:{ (DataSnapshot) in 
     if let item = DataSnapshot.value as? String{ 
      self.myList.append(item) 
      self.myTableView.reloadData() 
     } 
    }) 
    nameHandle = ref?.child("Name").observe(.childAdded, with:{ (DataSnapshot) in 
     if let nameItem = DataSnapshot.value as? String{ 
      self.myList.append(nameItem) 
      self.myTableView.reloadData() 
     } 
    }) 


} 

Mein Main.Storyboard:

enter image description here

Antwort

1

ich ein paar Dinge bemerken, die das Problem verursachen könnten.

In der cellForRowAt Funktion werden Sie textLabel mit einem Array myNameList und bevölkern detailTextLabel mit einem Array myList genannt genannt bevölkern. Wenn Sie die Daten jedoch in viewDidLoad laden, fügen Sie beide Inhalte an myList an. Wahrscheinlich ein Copy/Paste-Fehler, aber ich denke, einer davon sollte myNameList sein.

Auch Ihre Datenstruktur ist fehlerhaft. In cellForRowAtIndexPath, basierend darauf, wie Sie die Zeilen indizieren (unter Verwendung von indexPath.row), gehen Sie davon aus, dass die Elemente immer paarweise kommen und die beiden Referenzen immer die gleiche Anzahl an untergeordneten Elementen haben. Aber basierend auf saveBtn, kann ich einfach einfach eine name und nicht eine imageURL eingeben, und es wird nur die name speichern, und die gesamte Datenbank ist jetzt nicht übereinstimmend. Ich würde vorschlagen, ein einzelnes Kind ref namens items, wo jeder eine name und eine imageURL hat.

+0

Danke für die Hilfe. Das hat funktioniert! – Pannu

+0

Haben Sie Ideen, wie Sie Bilder in eine Firebase-Datenbank statt nur eine Bild-URL implementieren können? – Pannu

+0

Firebase Storage kann Speicher für Ihre Bilder bereitstellen. Sie konvertieren sie in 'Data' und laden sie mit Firebase Storage hoch, dann spuckt sie eine URL zurück, mit der Sie das Image herunterladen können, wenn Sie es wollen. https://firebase.google.com/docs/storage/ios/start – Connor

Verwandte Themen