使用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
。 他们工作得很好,并允许您使用UITableView
animation。 它多一点代码,但没有太多困难。
您可以使用.ChildChanged
一次获取一个项目的初始数据,然后它会监视更改。
如果你想在初始加载的时候一次性加载所有的数据,你需要使用.Value,我build议你使用observeSingleEventOfType
作为第一次加载的tableview。 请注意,如果您还添加了.ChildAdded
观察者,那么当添加观察者时,您还将获得一组初始数据,因此您需要处理这些项目(即,不要将它们添加到数据集中),否则将显示项目初始加载两次。
- 当应用程序closures时,Firebase IOS推送通知不起作用
- Swift嵌套查询中的Firebase无法正常工作
- GoogleToolboxForMac.framework和GoogleOpenSource.framework冲突
- 如何从Firebase中检索当前用户的数据
- 无法在Swift应用中导入Firebase
- 发布到Clearcut时发生错误:(null),Google Cloud Speech API中的状态码为400
- 如果Firebase控制台页面中提到了一个应用ID,是否可以创buildGoogleService-Info.plist?
- 在iOS Obj-C中何处添加Firebase数据库引用
- BigQuery不会为链接的Firebase Analytics事件日志显示任何数据集