2017-12-23 4 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

틀린 장소에 있습니다. 이 웹 사이트는 오류 추적 서비스를 실행하지 않습니다. 도움이 필요하면 무엇을하려고하는지 설명하십시오. 아무도 어떤 종류의 데이터를 표시하려고하는지 알지 못합니다. –

+0

코드가 의미가 없습니다. 각 사용자에 대한 섹션이 있고 행에 게시물을 표시하고 있습니다. 하지만'indexpath.row'를 사용하여 행이 1이면'users' 배열에 접근하려고합니다. 아마도'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-base- answers)이 실제로 도움이된다. 귀하의 게시물의 품질을 향상시킬 수 있습니다. 앞으로 독자의 질문에 답하고 있으며 코드 제안의 이유를 알지 못할 수도 있습니다. –

+0

당신의 제안에 대해 고마워요 :) 나는 분명히 대답하는 동안 마음에 그걸 유지합니다 :) – junaidUmer

0

사용자 배열의 내용은 무엇입니까?

사용자 또는 많은 행을 섹션으로 정의 하시겠습니까? 이 경우 하면 그것은 다음과 같아야 완전히 cellForRowAt

를 다시 작성해야,

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

으로 설명 사용

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 
}