Ios Swift 2 Firebase表视图

Ios Swift 2 Firebase表视图,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我是swift和firebase的新手,我正在尝试用firebase数据填充我的TabeView。当我运行程序时,tableview中没有显示任何内容。任何帮助都将不胜感激。这就是我所做的,我试着去阅读文件,但是没有帮助 import UIKit import Firebase import FirebaseUI class ChurchTableViewController: UITableViewController { let firebase = Firebase(url:"ht

我是swift和firebase的新手,我正在尝试用firebase数据填充我的TabeView。当我运行程序时,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
}

您已经为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返回的数据创建数据类型的示例

杂货店项目

要深入了解如何使用Firebase,您可以阅读本非常好的教程:


我希望这对您有所帮助。

您已经为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返回的数据创建数据类型的示例

杂货店项目

要深入了解如何使用Firebase,您可以阅读本非常好的教程:


我希望这能对您有所帮助。

检查您是否正确设置了Tableview的委托和数据源,若要执行此操作,请转到interface builder,cmd+右键单击Tableview,然后拖动到interface builder中的黄色标题图标


你应该看到两个选项,“数据源”和“委托”,确保它们都被选中,然后重新运行你的应用程序,你应该看到表格填充了你加载的任何数据,cmd+右键单击tableview并拖动到interface builder中的黄色标题图标


您应该看到两个选项,“datasource”和“delegate”,确保它们都被选中,然后重新运行您的应用程序,您应该看到表格中填充了您加载的任何数据。您有三个问题

1) 您没有为tableview填充数据源。这通常是一个存储在类中的数组,因为它是by.value,所以您需要迭代这些值以获取每个子节点的数据

2) 你在观察。价值观。这将返回节点中的所有内容、所有子节点、它们的子节点等,因此您将无法直接将其作为字符串值读取,除非节点包含的全部内容,如单个键:值对,否则将读取所有键:值对

3) Firebase是异步的,因此在observe块中,您需要填充数组,然后重新加载tableview

以下是解决方案:

给定结构

users    
    user_id_0
       name: "Biff"
    user_id_1
       name: "Buffy"
    user_id_2
       name: "Skip
下面是读取每个名称并填充名称数组的关联代码

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()
})
用项目数组替换名称数组


关键是让Firebase在通知tableView刷新自身之前异步加载数据,并且在使用.Value时,确保使用snapshot迭代该节点中的所有子节点。子节点有三个问题

1) 您没有为tableview填充数据源。这通常是一个存储在类中的数组,因为它是by.value,所以您需要迭代这些值以获取每个子节点的数据

2) 你在观察。价值观。这将返回节点中的所有内容、所有子节点、它们的子节点等,因此您将无法直接将其作为字符串值读取,除非节点包含的全部内容,如单个键:值对,否则将读取所有键:值对

3) Firebase是异步的,因此在observe块中,您需要填充数组,然后重新加载tableview

以下是解决方案:

给定结构

users    
    user_id_0
       name: "Biff"
    user_id_1
       name: "Buffy"
    user_id_2
       name: "Skip
下面是读取每个名称并填充名称数组的关联代码

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()
})
用项目数组替换名称数组

关键是让Firebase在通知tableView刷新自身之前异步加载数据,并且在使用.Value时,确保使用snapshot.children迭代该节点中的所有子节点
  • 这是因为
    项中没有数据。因此,首先在您的
    viewdide
    方法中,您需要将Firebase数据字典附加到
    数组中,然后调用
    tableView.reloadData()
  • 还要检查Firebase数据库url是否正确,在附加到
    数组时,需要以正确的格式获取和存储数据
      • 这是因为
        项中没有数据。因此,首先在您的
        viewdide
        方法中,您需要将Firebase数据字典附加到
        数组中,然后调用
        tableView.reloadData()
      • 还要检查Firebase数据库url是否正确,在附加到
        数组时,需要以正确的格式获取和存储数据

      下载后运行此命令tableview.reloaddata()可能是您的url错误?下载后运行此命令tableview.reloaddata()可能是您的url错误?有一个非常好的教程,非常感谢您的回复,itemType是NSDictionary。每当我将其替换为您提供的内容时,我都会在-->let itemType=NSDictionay(快照:item as!FDataSnapshot)处遇到错误。错误地说(参数标签’(快照:)‘不匹配任何可用的重载)@IamWayne这只是一个示例,当然您需要创建数据类型