TableView ของ Swift 2 Firebase

ฉันเป็นมือใหม่ที่มีความรวดเร็วและเป็น firebase ฉันกำลังพยายามเติมข้อมูล tabelview ด้วยข้อมูล firebase เมื่อฉันรันโปรแกรม ไม่มีอะไรแสดงใน tableview ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมยินดี นี่คือสิ่งที่ฉันทำไปไกล พยายามอ่านเอกสาร แต่ก็ไม่ได้ช่วยอะไร

import UIKit
import Firebase
import FirebaseUI


class ChurchTableViewController: UITableViewController {


let firebase = Firebase(url:"https://.....com/")

var items = [NSDictionary]()

override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
     //self.navigationItem.rightBarButtonItem = self.editButtonItem()
}

override func viewDidAppear(animated: Bool) {

    //MARK: Load data from firebsr
    firebase.observeEventType(.Value, withBlock: { snapshot in
        print(snapshot.value)
        }, withCancelBlock: { error in
            print(error.description)
    })

}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return items.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    let dict = items[indexPath.row]
    cell.textLabel?.text = dict["ChurchName"] as? String

    return cell
}

person Iam Wayne    schedule 17.04.2016    source แหล่งที่มา
comment
หลังจากดาวน์โหลดแล้ว ให้รันคำสั่งนี้ tableview.reloaddata()   -  person Mazel Tov    schedule 17.04.2016
comment
บางที url ของคุณอาจผิด?   -  person Yuchen    schedule 17.04.2016
comment
มีบทช่วยสอนที่ยอดเยี่ยมสำหรับเรื่องนี้ ที่นี่   -  person MikeG    schedule 18.04.2016


คำตอบ (4)


คุณได้สร้างผู้สังเกตการณ์เมื่อค่าบางอย่างเปลี่ยนแปลงใน Firebase DB ของคุณ แต่ในการปิด คุณจะต้องเพิ่มรายการใหม่และแน่นอนว่าโหลด UITableView ของคุณซ้ำเพื่อซิงโครไนซ์ข้อมูลในแอปของคุณ ดูโค้ดต่อไปนี้เพื่อดูตัวอย่าง วิธีดำเนินการกับประเภทข้อมูลตัวอย่างด้วย:

var items = [GroceryItem]()

override func viewDidAppear(animated: Bool) {
     super.viewDidAppear(animated)

     firebase.observeEventType(.Value, withBlock: { snapshot in
        var newItems = [GroceryItem]()

        for item in snapshot.children {
          let itemType = GroceryItem(snapshot: item as! FDataSnapshot)
          newItems.append(itemType)
        }

        // update your item with the new ones retrieved
        self.items = newItems

        // reload the data
       self.tableView.reloadData()
    })
}

ในโครงสร้างด้านล่าง คุณสามารถดูตัวอย่างวิธีสร้างประเภทข้อมูลจากข้อมูลที่ส่งคืนจาก Firebase

รายการของชำ

struct GroceryItem {

   let key: String!
   let name: String!
   let addedByUser: String!
   let ref: Firebase?
   var completed: Bool!

   // Initialize from arbitrary data
   init(name: String, addedByUser: String, completed: Bool, key: String = "") {
     self.key = key
     self.name = name
     self.addedByUser = addedByUser
     self.completed = completed
     self.ref = nil
   }

   init(snapshot: FDataSnapshot) {
     key = snapshot.key
     name = snapshot.value["name"] as! String
     addedByUser = snapshot.value["addedByUser"] as! String
     completed = snapshot.value["completed"] as! Bool
     ref = snapshot.ref
   }
}

สำหรับความรู้เชิงลึกเกี่ยวกับวิธีใช้ Firebase คุณสามารถอ่านบทช่วยสอนที่ดีมากนี้:

ฉันหวังว่านี่จะช่วยคุณได้

person Victor Sigler    schedule 17.04.2016
comment
ขอบคุณสำหรับการตอบกลับ itemType คือ NSDictionay เมื่อใดก็ตามที่ฉันแทนที่ด้วยสิ่งที่คุณให้ฉัน ฉันได้รับข้อผิดพลาดที่ ---> ให้ itemType = NSDictionay(snapshot: item as! FDataSnapshot) เกิดข้อผิดพลาดในการแจ้ง (ป้ายกำกับอาร์กิวเมนต์ '(สแนปชอต :)' ไม่ตรงกับการโอเวอร์โหลดที่มีอยู่) - person Iam Wayne; 18.04.2016
comment
@IamWayne มันเป็นเพียงตัวอย่างที่แน่นอนที่คุณต้องสร้างประเภทข้อมูลของคุณ ดูคำตอบที่อัปเดตของฉันเพื่อทำความเข้าใจคำตอบให้ดีขึ้นด้วยวิธีสร้างประเภทข้อมูล - person Victor Sigler; 18.04.2016

ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าผู้รับมอบสิทธิ์และแหล่งข้อมูลของ Tableview อย่างถูกต้อง โดยไปที่ตัวสร้างอินเทอร์เฟซ cmd + คลิกขวาที่ tableview ของคุณแล้วลากไปที่ไอคอนส่วนหัวสีเหลืองในตัวสร้างอินเทอร์เฟซ

คุณควรเห็นสองตัวเลือก ได้แก่ 'แหล่งข้อมูล' และ 'มอบสิทธิ์' ตรวจสอบให้แน่ใจว่าทั้งคู่ได้รับการตรวจสอบแล้ว จากนั้นเรียกใช้แอปของคุณอีกครั้ง คุณจะเห็นตารางที่เต็มไปด้วยข้อมูลใดก็ตามที่คุณโหลด

person NiallJG    schedule 17.04.2016

คุณมีสามประเด็น

1) คุณไม่ได้เติมแหล่งข้อมูลสำหรับ Tableview ของคุณ โดยทั่วไปแล้วนี่คืออาร์เรย์ที่จัดเก็บไว้ในคลาสและเนื่องจากเป็น .value คุณจะต้องวนซ้ำค่าเหล่านั้นเพื่อเข้าถึงข้อมูลโหนดลูกแต่ละอัน

2) คุณกำลังสังเกตด้วย .value สิ่งนี้จะส่งคืนทุกสิ่งในโหนด ลูกทั้งหมด ลูก ๆ ของพวกเขา ฯลฯ ดังนั้นคุณจะไม่สามารถอ่านมันได้โดยตรงเป็นค่าสตริง เว้นแต่นั่นคือโหนดทั้งหมดที่มี เช่นเดียวกับในคีย์เดียว: คู่ค่า มิฉะนั้นทั้งหมดจะเป็นคีย์ :value คู่จะถูกอ่าน

3) Firebase เป็นแบบอะซิงโครนัส ดังนั้นภายในบล็อกการสังเกต คุณจะต้องเติมอาร์เรย์ จากนั้นจึงโหลด tableview อีกครั้ง

นี่คือวิธีแก้ปัญหา:

ให้มีโครงสร้าง

users    
    user_id_0
       name: "Biff"
    user_id_1
       name: "Buffy"
    user_id_2
       name: "Skip

นี่คือโค้ดที่เกี่ยวข้องสำหรับอ่านในแต่ละชื่อและเติมข้อมูลใน NamesArray

var namesArray: [String] = []

ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
        for child in snapshot.children {
           let name = child.value["name"] as! String
           namesArray.append(name)
        }
        self.myTableView.reloadData()
})

แทนที่อาร์เรย์รายการของคุณสำหรับ nameArray

สิ่งสำคัญคือการปล่อยให้ Firebase โหลดข้อมูลแบบอะซิงโครนัสก่อนที่จะบอกให้ tableView รีเฟรชตัวเอง และเมื่อใช้ .Value ตรวจสอบให้แน่ใจว่าคุณวนซ้ำรายการย่อยทั้งหมดในโหนดนั้นด้วย snapshot.children

person Jay    schedule 17.04.2016

  • สิ่งนี้เกิดขึ้นเนื่องจากไม่มีข้อมูลในอาร์เรย์ items ของคุณ ดังนั้นก่อนอื่นในวิธีการ viewDidAppear ของคุณคุณต้องต่อท้ายพจนานุกรมข้อมูล Firebase ของคุณลงในอาร์เรย์ items แล้วโทร tableView.reloadData()
  • ตรวจสอบด้วยว่า URL ฐานข้อมูล Firebase ของคุณถูกต้อง และคุณต้องดึงข้อมูลและจัดเก็บข้อมูลในรูปแบบที่เหมาะสมในขณะที่ต่อท้ายอาร์เรย์ items
person Ashvini    schedule 13.06.2019