Swift 2 Firebase TableView

Я новичок в Swift и Firebase, я пытаюсь заполнить свое табличное представление данными Firebase. Когда я запускаю программу, в табличном представлении ничего не отображается. Будем рады любой помощи. Это то, что я сделал далеко, попытался прочитать документы, но это не помогло.

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
}

person Iam Wayne    schedule 17.04.2016    source источник
comment
После загрузки запустите эту команду tableview.reloaddata()   -  person Mazel Tov    schedule 17.04.2016
comment
Может быть, ваш адрес неверен?   -  person Yuchen    schedule 17.04.2016
comment
Для этого есть отличное руководство, прямо ЗДЕСЬ   -  person MikeG    schedule 18.04.2016


Ответы (4)


Вы создали наблюдатель, когда какое-то значение изменяется в вашей базе данных Firebase, но в вашем закрытии вам нужно добавить новые элементы и, конечно же, перезагрузить 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.

Продуктовый товар

struct GroceryItem {

   let key: String!
   let name: String!
   let addedByUser: String!
   let ref: Firebase?
   var completed: Bool!

   // Initialize from arbitrary data
   init(name: String, addedByUser: String, completed: Bool, key: String = "") {
     self.key = key
     self.name = name
     self.addedByUser = addedByUser
     self.completed = completed
     self.ref = nil
   }

   init(snapshot: FDataSnapshot) {
     key = snapshot.key
     name = snapshot.value["name"] as! String
     addedByUser = snapshot.value["addedByUser"] as! String
     completed = snapshot.value["completed"] as! Bool
     ref = snapshot.ref
   }
}

Для получения более глубоких знаний о том, как использовать Firebase, вы можете прочитать этот очень хороший учебник:

Я надеюсь, что это поможет вам.

person Victor Sigler    schedule 17.04.2016
comment
Спасибо за ваш ответ, itemType - NSDictionay. Всякий раз, когда я заменяю его тем, что вы мне дали, я получаю сообщение об ошибке ---› let itemType = NSDictionay(snapshot: item as! FDataSnapshot). Сообщение об ошибке ( метки аргументов '(моментальный снимок:)' не соответствуют ни одной из доступных перегрузок) - person Iam Wayne; 18.04.2016
comment
@IamWayne Это был просто образец, конечно, вам нужно создать из него свой тип данных, посмотрите мой обновленный ответ, чтобы лучше понять ответ со способом создания типа данных. - person Victor Sigler; 18.04.2016

Убедитесь, что вы правильно настроили делегата и источник данных вашего Tableview, для этого перейдите к построителю интерфейса, cmd + щелкните правой кнопкой мыши на своем табличном представлении и перетащите на желтый значок заголовка в построителе интерфейса.

Вы должны увидеть две опции: «источник данных» и «делегировать», убедитесь, что они оба отмечены, а затем перезапустите приложение, вы должны увидеть, что таблица заполняется любыми данными, которые вы загрузили.

person NiallJG    schedule 17.04.2016

У вас есть три проблемы

1) Вы не заполняете источник данных для своего табличного представления. Обычно это массив, который хранится в классе, и, поскольку он по .value, вам нужно будет перебирать эти значения, чтобы получить данные каждого дочернего узла.

2) Вы наблюдаете по .value. Это вернет все в узле, все дочерние элементы, их дочерние элементы и т. д., поэтому вы не сможете напрямую прочитать его как строковое значение, если только это не все, что содержит узел, как в одной паре ключ: значение, в противном случае все они ключ Пары :value будут прочитаны.

3) Firebase является асинхронным, поэтому в блоке наблюдения вам необходимо заполнить массив, а затем повторно загрузить представление таблицы.

Вот решение:

Учитывая структуру

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()
})

замените массив элементов на nameArray.

Ключевым моментом является то, чтобы позволить Firebase загружать данные асинхронно, прежде чем сообщать tableView об обновлении, а при использовании .Value убедитесь, что вы выполняете итерацию по всем дочерним элементам в этом узле с помощью snapshot.children.

person Jay    schedule 17.04.2016

  • Это произошло потому, что в вашем массиве items нет данных. Итак, сначала внутри вашего метода viewDidAppear вам нужно добавить словари данных Firebase в массив items, а затем вызвать tableView.reloadData().
  • Также проверьте правильность URL-адреса базы данных Firebase, и вам необходимо получать и хранить данные в правильном формате при добавлении к массиву items.
person Ashvini    schedule 13.06.2019