2017-10-03 1 views
0

Meine Datenbank BaumSwift Firebase Abrufen von Daten in Tableview

enter image description here

Hallo, Ich versuche, Daten abzurufen, um zu Tableview, aber obwohl ich Daten von Firebase Datenbank lesen kann, ich kann sie nicht in der Tabellenansicht angezeigt werden . Mein Code ist unten, ich hoffe du kannst mir helfen.

class Calls { 

var callType: String? 
var callHospital: String? 

init(callType: String?, callHospital: String?) { 
    self.callType = callType 
    self.callHospital = callHospital 
} 
} 

class myCallsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

var ref:DatabaseReference! 
var myCallList = [Calls]() 

@IBOutlet weak var callListTableView: UITableView! 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "customcell", for: indexPath) as! myCallsViewControllerTableViewCell 

    let test = myCallList[indexPath.row] 
    cell.callType?.text = test.callType 
    cell.callHospital?.text = test.callHospital 

    return cell 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    callListTableView.dataSource = self 
    callListTableView.delegate = self 
    LoadCalls() 
} 

func LoadCalls() { 
    ref = Database.database().reference() 
    let userID = Auth.auth().currentUser?.uid 
    ref.child("calls").queryOrdered(byChild: "userID").queryEqual(toValue: userID!).observe(.childAdded, with: { (snapshot) in 
     if snapshot.childrenCount > 0{ 
     self.myCallList.removeAll() 
      for result in snapshot.children.allObjects as! [DataSnapshot]{ 
       let results = result.value as? [String : AnyObject] 
       let type = results?["calltype"] 
       let hospital = results?["hospital"] 
       let myCalls = Calls(callType: type as! String?, callHospital: hospital as! String?) 
       self.myCallList.append(myCalls) 
     } 
       self.callListTableView.reloadData() 
     } 
     }) 
} 
+0

Können Sie bitte eine ** print-Anweisung setzen ** innerhalb der for loop von LoadCalls und zeige uns das Ergebnis – Siyavash

+0

Ich setze die dump-Anweisung so: lass myCalls = Anrufe (callType: type als! String ?, callHospital: Krankenhaus als! String?) self.myCallList.append (myCalls) dump (myCalls) und das Ergebnis ist Kan_Bagisi_Portali.Calls # 0 - Calltype: nil - callHospital: nil ▿ Kan_Bagisi_Portali.Calls # 0 - Calltype: nil - callHospital : nil ▿ Kan_Bagisi_Portali.Calls # 0 - callType: null - callHospital: nil .... geht weiter so –

+0

Ich möchte überprüfen, ob Sie tatsächlich irgendwelche Daten von Firebase erhalten, da es nicht scheint ein Problem mit Ihrem Code sein – Siyavash

Antwort

0

Ihr Problem hat wahrscheinlich mit der Tatsache zu tun, dass Sie reload() aus einem Verschluss anrufen, was bedeutet, sind Sie die Benutzeroberfläche von einem Hintergrund-Thread zu aktualisieren. Schauen Sie sich diese Antwort:

Swift UITableView reloadData in a closure

+0

Ich versuchte, aber es gibt mir Assertionsfehler in - [UITableView _dequeueReusableCellWithIdentifier: forIndexPath: usingPresentationValues:] stürzt dann ab –

+0

In dem Code, den Sie gepostet haben, registrieren Sie nicht die Zelle mit der Tabellenansicht. Machst du das anderswo? https://stackoverflow.com/questions/12737860/assertion-failure-in-dequeuerecellwithidentifierforindexpath – Blake

+0

ja mache ich in einer UITableViewCell als @IBOutlet schwach var callType: UILabel! IBOutlet schwach var callHospital: UILabel! –

1

ich das Problem gelöst, danke Jungs, Blake und Siyavash, so viel. Ich registrierte die Zelle und legte die Hauptwarteschlange an und es funktionierte. Hier ist der neueste Code: Klasse fordert {

var callType: String? 
var callHospital: String? 

init(callType: String?, callHospital: String?) { 
    self.callType = callType 
    self.callHospital = callHospital 
} 

}

Klasse myCallsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var ref:DatabaseReference! 
var myCallList = [Calls]() 

@IBOutlet weak var callListTableView: UITableView! 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "customcell", for: indexPath) as! myCallsViewControllerTableViewCell 

    let test = myCallList[indexPath.row] 
    cell.callType?.text = test.callType 
    cell.callHospital?.text = test.callHospital 

    return cell 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    callListTableView.dataSource = self 
    callListTableView.delegate = self 
    LoadCalls() 
} 

func LoadCalls() { 
    ref = Database.database().reference() 
    let userID = Auth.auth().currentUser?.uid 
    ref.child("calls").queryOrdered(byChild: "userID").queryEqual(toValue: userID!).observe(.childAdded, with: { (snapshot) in 
       let results = snapshot.value as? [String : AnyObject] 
       let type = results?["calltype"] 
       let hospital = results?["hospital"] 
       let myCalls = Calls(callType: type as! String?, callHospital: hospital as! String?) 
       self.myCallList.append(myCalls) 
       DispatchQueue.main.async { 
        self.callListTableView.reloadData() 
       } 
     }) 
} 
+0

No prob. Wenn meine Antwort hilfreich wäre, würde es Ihnen etwas ausmachen, sie anzunehmen? – Blake

+0

Awesome Happy Codierung :) – Siyavash

Verwandte Themen