2017-12-23 28 views
-4

人々を使用し、私はこの問題を持っていますここで行って ? 私はInstagramクローンを構築しようとしていて、私のホームビューコントローラでは、何が表示されるべきかを示しています。私はテーブルビューでナビゲーションを行い、そのテーブルビューは異なる識別子を持つ2つのセルを持っています。セル番号1は、ユーザーのテーブルからユーザー名ラベルとプロファイルイメージにデータを持ち込むヘッダーです。ポストには画像とキャプションのようなポストデータが必要です。私はfirebaseデータベースを使用します。インデックスiはcelllに(スウィフト)

私のコード:

import UIKit 

import FirebaseAuth 

import FirebaseDatabase 

class HomeViewController: UIViewController ,UITableViewDelegate { 


    @IBOutlet weak var tableview: UITableView! 
    var posts = [Post]() 
    var users = [UserD]() 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     tableview.dataSource = self 
     loadposts() 
     userDetal() 

    // var post = Post(captiontxt: "test", photoUrlString: "urll") 
    // print(post.caption) 
    // print(post.photoUrl) 

    } 

    func loadposts() { 
     Database.database().reference().child("posts").observe(.childAdded){ (snapshot: DataSnapshot)in 
      print(Thread.isMainThread) 
       if let dict = snapshot.value as? [String: Any]{ 
       let captiontxt = dict["caption"] as! String 
       let photoUrlString = dict["photoUrl"] as! String 
       let post = Post(captiontxt: captiontxt, photoUrlString: photoUrlString) 
       self.posts.append(post) 
       print(self.posts) 
       self.tableview.reloadData() 
      } 
     } 
    } 
    func userDetal() { 
     Database.database().reference().child("users").observe(.childAdded){ (snapshot: DataSnapshot)in 
      print(Thread.isMainThread) 
      if let dict = snapshot.value as? [String: Any]{ 
       let usernametxt = dict["username"] as! String 
       let profileImageUrlString = dict["profileImageUrl"] as! String 
       let user = UserD(usernametxt: usernametxt, profileImageUrlString: profileImageUrlString) 
       self.users.append(user) 
       print(self.users) 
       self.tableview.reloadData() 
      } 
     } 
    } 

    @IBAction func logout(_ sender: Any) { 
     do { 
      try Auth.auth().signOut() 
     }catch let logoutErrorr{ 
      print(logoutErrorr) 
     } 
     let storyboard = UIStoryboard(name: "Start", bundle: nil) 
     let signinVC = storyboard.instantiateViewController(withIdentifier: "SigninViewController") 
     self.present(signinVC, animated: true, completion: nil) 


    } 

} 

extension HomeViewController: UITableViewDataSource{ 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return posts.count 

    } 
    func numberOfSections(in tableView: UITableView) -> Int { 
     return users.count 
    } 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     if indexPath.row == 0{ 
     let cell = tableview.dequeueReusableCell(withIdentifier: "imagecell", for: indexPath) as! PostCellTableViewCell 

     cell.postimage.image = nil 

     cell.tag += 1 
     let tag = cell.tag 

     cell.captionLabel.text = posts[indexPath.row].caption 

     let photoUrl = posts[indexPath.row].photoUrl 

     getImage(url: photoUrl) { photo in 
      if photo != nil { 
       if cell.tag == tag { 
        DispatchQueue.main.async { 
         cell.postimage.image = photo 

        } 
       } 
      } 
     } 
     return cell 
     } else if indexPath.row == 1 { 
      let cell = tableview.dequeueReusableCell(withIdentifier: "postcell", for: indexPath) as! HeaderTableViewCell 

      cell.userimage.image = nil 

      cell.tag += 1 
      let tag = cell.tag 
      cell.usernamelabel.text = users[indexPath.row].username 
      //Error showing here???????????????????????????????????? 
      let profileImageUrl = users[indexPath.row].profileImageUrl 

      getImage(url: profileImageUrl) { photo in 
       if photo != nil { 
        if cell.tag == tag { 
         DispatchQueue.main.async { 
          cell.userimage.image = photo 


         } 
        } 
       } 
      } 

      return cell 
     } 
     return UITableViewCell() 

    } 


    func getImage(url: String, completion: @escaping (UIImage?) ->()) { 
     URLSession.shared.dataTask(with: URL(string: url)!) { data, response, error in 
      if error == nil { 
       completion(UIImage(data: data!)) 
      } else { 
       completion(nil) 
      } 
      }.resume() 
} 
} 
+0

あなたは間違った場所にいます。このWebサイトでは、エラー追跡サービスは実行されません。援助が必要な場合は、何をしようとしているのか説明してください。誰もあなたが表示しようとしているデータの種類を知っていません。 –

+0

コードは意味をなさない。各ユーザーのセクションがあり、行内のポストを表示しています。しかし 'indexpath.row'を使って' users'配列にアクセスしようとすると 'rows'が1になり、おそらく' users'配列に1人のユーザしかいないので、配列境界エラーを受け取ります。 – Paulw11

+0

私はごめんなさい私の友人は今私は説明するが、説明する。私にちょうど初心者を与えるため – ghazzway

答えて

0

ありがとう、私の友人が、私は格納するための良い方法を見つけました私の細胞。ポストセルの場合、私はちょうどcellForRowAtを使用しますが、ポストデータです。ヘッダーセルiの場合viewForHeaderInSection を使用し、私のユーザーデータはheightForHeaderInSectionです。あなたが間違った場所にいるのを見てください。

0

これを試してみてください。

cell.tag = indexpath.row 
+1

このコードスニペットが問題を解決するかもしれないが、[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)が本当に役立つあなたの投稿の質を向上させる。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 –

+0

あなたの提案をありがとう:)私は確かに応答中に心にそれを保つ:) – junaidUmer

0

ユーザー配列の内容は何ですか?

あなたはユーザーとしてセクション数を定義してもよろしいですか? が

func numberOfRows(in tableView: NSTableView) -> Int { 
    return users.count 
} 

としては説明した。この場合の使用には、あなたが完全にcellForRowAt

を書き換える必要があることは、次のようになります。

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 

    if row < users.count { 
     let user = users[row] 
     if let cellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "CellID"), owner: self) { 
      (cellView as! NSTableCellView).textField?.stringValue = user.name 
      // do the same for all the fields you need to set 
      return cellView 
     } else { 
      return nil 
     } 
    } 
    return nil 
} 
関連する問題