使用Firebase Data Swift,Xcode 7填充UITableViewController

时间:2015-12-13 00:24:21

标签: ios uitableview firebase

我正与swift中的Xcode 7合作。我对Swift, Xcode, and Firebase完全不熟悉。我希望在我的iOS应用中有三个UITableViewController。前两个TableView controllers需要动态内容,第三个TableView控制器需要静态内容。我希望第二个和第三个TableView控制器根据在前一个TableView控制器上按下的内容显示数据。所有数据都来自我的Firebase。我不知道从哪里开始。请指出我正确的方向!谢谢!

2 个答案:

答案 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 .ChildAddedUITableViews。它们工作得很好,允许您使用UITableView动画。它的代码多一点,但没什么太难的。

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

如果您希望在初始加载中一次性显示所有数据,则需要。值,我建议您使用observeSingleEventOfType进行第一次加载tableview。请注意,如果您还有.ChildAdded观察者,那么在添加观察者时您也会获得一组初始数据 - 因此您需要处理这些项目(即不要将它们添加到您的数据集中)否则您的项目将在初始加载时出现两次。