2016-06-20 15 views
1

私はユーザーが参加しているチャットのtableViewを作成しようとしています。彼らのサイトでfirebaseのチュートリアルに従っていて、彼らはチャットルームのリストを簡単に取得して、ユーザーが子供を作り、その子供に部屋の名前を追加することになったと言っていました。 SwiftとFirebaseがデータベースを照会しています

は、だから私の構造は、この

Users 
    UNIQUE KEY 
     nickname: "name" 
     rooms 
      name: true 
Room 
etc etc 

のようにだから私のcellForRowに私は

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

    firebase.child("users").child(fUID).observeSingleEvent(of: .value, with: { snapshot in 
     for user in snapshot.children.allObjects as! [FIRDataSnapshot]{ 
      self.names = (user.value?["participating"] as? String)! 
     } 
    }) 

    cell.textLabel?.text = self.names 
    cell.detailTextLabel?.text = "test" 

    return cell 
} 

が、私はエラーを取得し、このコードを使用して見えるI PO名前は空の文字列

を起動したとき

誰かが私に何が間違っていて、それをどう修正するのか理解できますか?私は部分的に今

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    let ref = firebase.child("users").child(fUID).child("participating") 

    ref.observeSingleEvent(of: .value, with: { snapshot in 

     print(snapshot.value) 

     var dict = [String: Bool]() 

     dict = snapshot.value as! Dictionary 

     for (key, _) in dict { 
      self.names = key 
      print(self.names) 
     } 

     self.rooms.append(self.names) 
     self.tableView.reloadData() 
    }) 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return self.rooms.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 

    cell.textLabel?.text = self.rooms[indexPath.row] 

    cell.detailTextLabel?.text = "test" 

    return cell 
} 

問題を動作するようにコードを得ている

EDIT 1

はfirebase中2つの項目があるということです...そして、それは一つだけを示しているありがとうそのうちの

+0

私はcellForRowAtIndexPath以外の配列全体を観察します。たとえば、viewDidAppearにあります。その後、一度フェッチからのアイテムを持っていれば、テーブルビューをリロードします。 – DogCoffee

+0

私の問題は、self.names ...という行にあります。エラーEXC_BAD_Instruction .... – RubberDucky4444

+0

あなたが作っているfirebaseの呼び出しはコールバックにあります。あなたの設定は間違っています。 firebase呼び出しを、私が上で述べたところに移動し、そのデリゲートメソッド内に移動しないでください。 – DogCoffee

答えて

2

あなたが使用しているコードは難題です。ここでは単純化したバージョンです:

let usersRef = firebase.child("users") 
let thisUser = usersRef.childByAppendingPath(fUID) 
let thisUsersRooms = thisUser.childByAppendingPath("rooms") 

thisUsersRooms.observeSingleEventOfType(.Value, withBlock: { snapshot in 

    if (snapshot.value is NSNull) { 
      print("not found") 
    } else { 
      for child in snapshot.children { 
       let roomName = child.key as String 
       print(roomName) //prints each room name 
       self.roomsArray.append(roomName) 
      } 

      self.myRoomsTableView.reloadData() 
    } 
}) 

が言われていること、このコードは、配列を移入するためのviewDidLoad内から呼び出されるべき、とのtableViewがリフレッシュされるよう、データはあなたのcellViewを投入するためにその配列からプルする必要があります。

+0

ありがとう、魅力 – RubberDucky4444

+0

@ RubberDucky4444素晴らしい!うれしかったよ! – Jay

関連する問題