2016-04-17 4 views
0

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

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 
} 
+0

После вашей загрузки перспективе this command tableview.reloaddata() –

+0

Возможно, ваш адрес неправильный? –

+0

Существует отличный учебник для этого точно, прямо [ЗДЕСЬ] (https://www.raywenderlich.com/109706/firebase-tutorial-getting-started) – MikeG

ответ

2

Вы создали наблюдатель, когда какое-то значение изменение в вашей 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

GroceryItem

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 вы можете прочитать это очень хороший учебник:

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

+0

ОТПРАВИТЬ ОТВЕТ НА ОТВЕТ, itemType - это NSDictionay. Всякий раз, когда я заменяю его тем, что вы мне дали, я получаю ошибку при ---> let itemType = NSDictionay (моментальный снимок: элемент как! FDataSnapshot). Ошибка при написании («Ярлыки аргументов» (snapshot :) »не соответствуют никаким доступным перегрузкам) –

+0

@IamWayne Это был всего лишь образец, конечно, вам нужно создать свой тип данных, см. Мой обновленный ответ, чтобы лучше понять ответ с помощью создания типа данных –

0

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

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

0

You» у вас есть три вопроса

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

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

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

Вот решение:

данной структуре

users  
    user_id_0 
     name: "Biff" 
    user_id_1 
     name: "Buffy" 
    user_id_2 
     name: "Skip 

вот связанный код для чтения во всех названиях и заполнить именаArray

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

замените ваш массив элементов для namesArray.

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

Смежные вопросы