使用Firebase Data Swift填充UITableViewController,Xcode 7

我在Xcode 7使用swift 。 我对Swift, Xcode, and Firebase完全Swift, Xcode, and Firebase 。 我想在我的iOS应用程序中有三个UITableViewController 。 前两个TableView controllers需要dynamic内容,第三个TableView控制器需要静态内容。 我希望第二个和第三个TableView控制器能够显示基于前一个TableView控制器上按下的内容的数据。 所有的数据将来自我的Firebase。 我不知道从哪里开始。 请指向正确的方向! 谢谢!

这个问题是广泛的,它要求如何做三个不同的任务。

如果你一次只问一件事,我想你会更好的得到答案。

我可以帮助您使用Firebase填充UITableViewController

 class MyTableViewController: UITableViewController { // your firebase reference as a property var ref: Firebase! // your data source, you can replace this with your own model if you wish var items = [FDataSnapshot]() override func viewDidLoad() { super.viewDidLoad() // initialize the ref in viewDidLoad ref = Firebase(url: "<my-firebase-app>/items") } override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) // listen for update with the .Value event ref.observeEventType(.Value) { (snapshot: FDataSnapshot!) in var newItems = [FDataSnapshot]() // loop through the children and append them to the new array for item in snapshot.children { newItems.append(item as! FDataSnapshot) } // replace the old array self.items = newItems // reload the UITableView self.tableView.reloadData() } } } 

这种技术使用.Value事件,你也可以使用.ChildAdded ,但是你必须跟踪.ChildChanged ,'.ChildRemoved'和.ChildMoved ,它们会变得非常复杂。

适用于iOS的FirebaseUI库非常容易处理。

 dataSource = FirebaseTableViewDataSource(ref: self.firebaseRef, cellReuseIdentifier: "<YOUR-REUSE-IDENTIFIER>", view: self.tableView) dataSource.populateCellWithBlock { (cell: UITableViewCell, obj: NSObject) -> Void in let snap = obj as! FDataSnapshot // Populate cell as you see fit, like as below cell.textLabel?.text = snap.key as String } 

当我有一个UITableViewController的时候,我做的稍微有些不同,尤其是那些可以推到另一个细节视图/或者在顶部显示一个模态视图的人。

ViewDidAppear中的setObserver运行良好。 然而,我不喜欢这样一个事实,即当我查看一个单元格的详细信息视图并随后popup该视图时,我从Firebase获取并重新载入表,尽pipe可能没有更改。

这样观察者被添加到viewDidLoad中,并且只有当它从Nav控制器堆栈popup时才被移除。 viewAppears时不会不必要地重载tableview。

 var myRef:FIRDatabaseReference = "" // your reference override func viewDidLoad() { super.viewDidLoad() setObserver() } override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) // only called when popped from the Nav Controller stack // if I push to another detail view my observer will remain active if isBeingDismissed() || isMovingFromParentViewController() { myRef.removeAllObservers() } } func setObserver() { myRef.observeEventType(.Value, withBlock: { snapshot in var newThings = [MyThing]() for s in snapshot.children { let ss = s as! FIRDataSnapshot let new = MyThing(snap: ss) // convert my snapshot into my type newThings.append(new) } self.things = newThings.sort{ $0.name < $1.name) } // some sort self.tableView.reloadData() }) } 

我也在UITableViews使用.ChildChanged .ChildDeleted.ChildAdded 。 他们工作得很好,并允许您使用UITableViewanimation。 它多一点代码,但没有太多困难。

您可以使用.ChildChanged一次获取一个项目的初始数据,然后它会监视更改。

如果你想在初始加载的时候一次性加载所有的数据,你需要使用.Value,我build议你使用observeSingleEventOfType作为第一次加载的tableview。 请注意,如果您还添加了.ChildAdded观察者,那么当添加观察者时,您还将获得一组初始数据,因此您需要处理这些项目(即,不要将它们添加到数据集中),否则将显示项目初始加载两次。