1

ログインしたユーザーのデータをFirebaseから取得しようとしています。ただし、observeSigleEventのメソッドの内部に入ってデータを取り込むことはないので、cellForRowAtIndexpathメソッドの場合、配列の戻り値はnilとなり、致命的なエラーが発生します。インデックスが範囲外です。Swift Firebase observeSingleEventのメソッドを呼び出さない

コードは以下のとおりです。

@IBOutlet var tableView: UITableView! 
@IBOutlet var homeActivityIndicator: UIActivityIndicatorView! 

var databaseRef = Database.database().reference() 
var loggedInUser = Auth.auth().currentUser 


var loggedInUserData : AnyObject? 

var posts = [AnyObject?]() 


override func viewDidLoad() { 
    super.viewDidLoad() 

    // get loggedinUser Details 

    self.databaseRef.child("user_profiles").child(self.loggedInUser!.uid).observeSingleEvent(of:.value, with: { 
     (snapshot) in 

     if(snapshot.exists()){ 
      self.loggedInUserData = snapshot 

      // get all posts that are made by user 
      self.databaseRef.child("posts/\(self.loggedInUser!.uid)").observe(.childAdded, with:{ (snapshot2) in 
       if(snapshot2.exists()){ 
        self.posts.append(snapshot2) 
        self.tableView.insertRows(at: [IndexPath (row: 0, section: 0)], with: UITableViewRowAnimation.automatic) 
        self.homeActivityIndicator.stopAnimating() 
       }else{return} 
      }){(error) in 
       print(error.localizedDescription) 
      } 
     }else{return} 
    }) 
} 

func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 1 
} 

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

    let cell : homeViewTableViewCell = tableView.dequeueReusableCell(withIdentifier: "HomeViewTableViewCell", for: indexPath) as! homeViewTableViewCell 

    let post = posts[(self.posts.count-1) - (indexPath).row]!.value(forKey: "text") as! String 

    cell.configure(profilePic: nil, name: self.loggedInUserData!.value(forKey: "name") as! String, handle: self.loggedInUserData!.value(forKey: "handle") as! String, post: post) 

    return cell 
} 

答えて

1

のViewControllerが最初に初期化されるときFirebaseからのデータは初期化後の(比較的)長い時間で来ることはありませんしながら、すべてのtableView機能は、と呼ばれているためです。とき

が呼び出されると、それは何もない配列のインデックス-1にアクセスしようとしているため、あなたの例外です。

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

あなたの子供は、リスナーが呼び出される追加たびに、tableView.reloadData()とのtableViewを更新:動的行の数を変更するには、次を設定してみてください、あなたの問題を解決するために

+1

ありがとうございました!出来た。 –

関連する問題