我正与swift
中的Xcode 7
合作。我对Swift, Xcode, and Firebase
完全不熟悉。我希望在我的iOS应用中有三个UITableViewController
。前两个TableView controllers
需要动态内容,第三个TableView控制器需要静态内容。我希望第二个和第三个TableView控制器根据在前一个TableView控制器上按下的内容显示数据。所有数据都来自我的Firebase。我不知道从哪里开始。请指出我正确的方向!谢谢!
答案 0 :(得分:8)
这个问题很广泛,因为它询问如何完成三个不同的任务。
如果你一次只要求一件事,我认为你最好能得到答案。
我可以帮助您使用Firebase填充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
,但是您必须跟踪.ChildMoved
,'。KidRemoved'和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
}
,这会变得相当复杂。
The FirebaseUI library for iOS handles this pretty easily.
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:bottom="48dp" android:drawable="@drawable/bg">
</item>
</layer-list>
答案 1 :(得分:2)
当我有一个UITableViewController时,我做的略有不同,特别是那些可以推送到另一个细节视图/或在顶部显示模态视图的人。
在ViewDidAppear中使用setObserver效果很好。但是,我不喜欢这样的事实:当我查看单元格详细信息视图并随后弹出该视图时,我从Firebase获取并再次重新加载表,尽管可能没有进行任何更改。
这样,观察者将添加到viewDidLoad中,并且仅在从Nav Controller堆栈弹出自身时才会被删除。 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()
})
}
我还在.ChildChanged
中使用.ChildDeleted
.ChildAdded
和UITableViews
。它们工作得很好,允许您使用UITableView
动画。它的代码多一点,但没什么太难的。
您可以使用.ChildChanged
一次获取一个项目的初始数据,然后它将监视此后的更改。
如果您希望在初始加载中一次性显示所有数据,则需要。值,我建议您使用observeSingleEventOfType
进行第一次加载tableview。请注意,如果您还有.ChildAdded
观察者,那么在添加观察者时您也会获得一组初始数据 - 因此您需要处理这些项目(即不要将它们添加到您的数据集中)否则您的项目将在初始加载时出现两次。