2017-12-23 24 views
-4

Menschen, habe ich dieses Problem, wenn ich Bild versuchen, wieder aus verschiedenem Zell (Thread 1: Fatal error: Index außerhalb des Bereichs)Index außerhalb des zulässigen Bereichs, wenn ich zu celll verwenden (Swift)

, was ich bin hier machen? Ich versuche einen Instagram-Klon zu erstellen und in meinem Home-View-Controller, was Posts angezeigt werden sollen. Ich mache die Navigation mit einer Tabellenansicht und diese Tabellenansicht hat 2 Zellen mit dem unterschiedlichen Bezeichner. Zelle Nummer 1 ist eine Kopfzeile, die Daten aus der Benutzertabelle zu meinem Benutzernamen und Profilbild bringt. und Zelle Nummer 2 für Posts sollte es Post-Daten wie Bild und Bildunterschrift bringen. Ich benutze Firebase-Datenbank.

mein Code:

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

Sie sind an einem falschen Ort. Diese Website führt keinen Fehlerverfolgungsdienst aus. Wenn Sie Hilfe benötigen, erklären Sie, was Sie zu tun versuchen. Niemand weiß, welche Art von Daten Sie zu zeigen versuchen. –

+0

Ihr Code macht keinen Sinn; Sie haben einen Abschnitt für jeden Benutzer und Sie zeigen Beiträge in den Zeilen an. Aber dann versuchen Sie und verwenden Sie 'indexpath.row', um auf Ihre' Benutzer' Array zugreifen, wenn die Zeile 1 ist, und vermutlich haben Sie nur 1 Benutzer in der 'Benutzer'-Array, so erhalten Sie eine Array-Grenzen Fehler – Paulw11

+0

Es tut mir leid mein Freund jetzt erkläre ich aber. für das Geben mir im gerade Anfänger – ghazzway

Antwort

0

Thanx, ich, eine gute Art und Weise zu enthalten Meine Zelle. für Post-Zelle, verwende ich einfach cellForRowAt und aber die Post-Daten. für Header-Zelle verwende ich viewForHeaderInSection und aber meine Benutzerdaten mit heightForHeaderInSection. um das hohe für einen Blick zu machen

0

versuchen diese.

cell.tag = indexpath.row 
+1

Während dieses Codeschnipsel die Frage lösen kann, [hilft eine Erklärung] (http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answer) wirklich um die Qualität Ihres Posts zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. –

+0

Vielen Dank für Ihren Vorschlag :) Ich werde dies sicherlich bei der Beantwortung beachten :) – junaidUmer

0

Was ist der Inhalt von Benutzer-Array?

Sind Sie sicher, dass Sie so viele Abschnitte wie Benutzer oder so viele Zeilen definieren möchten? In diesem Fall

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

Wie verwenden erklärt, müssen Sie vollständig cellForRowAt

umschreiben Es sollte wie folgt aussehen:

fand mein Freund
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 
} 
Verwandte Themen