2017-09-22 11 views
0

Ich versuche, eine Tabellenansicht mit zwei verschiedenen Prototypzellen zu laden. profileCell sollte nur einmal und am Anfang der Tabellenansicht geladen werden. dogCell sollte ein Array von dog Objekte mit dem Namen dogs von Firebase heruntergeladen zählen. Derzeit wird nur die erste Zelle korrekt angezeigt.Swift: Tabellenansicht gibt nur eine Zelle zurück

Ich denke, die numberOfRowsInSection Methode zählt nicht genau die Hund Objekte in der Hunde-Array. Wenn ich einen Haltepunkt auf return dogs.count + 1 und po dogs.count setze, gibt der Debugger weiterhin 0 aus. Wenn ich return dogs.count verwende, wird die Tabellenansicht geladen, aber nur mit der Profilzelle. Wenn ich return dogs.count + 1 (auf Konto für das Profil Zelle oben) verwenden, wird eine Ausnahme ausgelöst, wenn dogCell Konstruktion: „schwerwiegender Fehler: Index außerhalb des zulässigen Bereichs“

Vielleicht muss ich die Art und Weise ändern, meine Tableview Daten nachlädt?

Hier ist mein Code:

class DogTableViewController: UITableViewController { 

    var user = User() 
    let profileCell = ProfileTableViewCell() 
    var dogs = [Dog]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let userDogRef = Database.database().reference().child("users").child(user.uid!).child("dogs") 

     let userProfileImageView = UIImageView() 
     userProfileImageView.translatesAutoresizingMaskIntoConstraints = false 
     userProfileImageView.widthAnchor.constraint(equalToConstant: 40).isActive = true 
     userProfileImageView.heightAnchor.constraint(equalToConstant: 40).isActive = true 
     userProfileImageView.layer.cornerRadius = 20 
     userProfileImageView.clipsToBounds = true 
     userProfileImageView.contentMode = .scaleAspectFill 
     userProfileImageView.image = UIImage(named: "AppIcon") 

     navigationItem.titleView = userProfileImageView 

     //MARK: Download dogs from firebase 
     userDogRef.observe(.childAdded, with: { (snapshot) in 
      if snapshot.value == nil { 
       print("no new dog found") 
      } else { 
       print("new dog found") 

       let snapshotValue = snapshot.value as! Dictionary<String, String> 
       let dogID = snapshotValue["dogID"]! 

       let dogRef = Database.database().reference().child("dogs").child(dogID) 
       dogRef.observeSingleEvent(of: .value, with: { (snap) in 
        print("Found dog data!") 
        let value = snap.value as? NSDictionary 
        let newDog = Dog() 

        newDog.name = value?["name"] as? String ?? "" 
        newDog.breed = value?["breed"] as? String ?? "" 
        newDog.creator = value?["creator"] as? String ?? "" 
        newDog.score = Int(value?["score"] as? String ?? "") 
        newDog.imageURL = value?["imageURL"] as? String ?? "" 
        newDog.dogID = snapshot.key 

        URLSession.shared.dataTask(with: URL(string: newDog.imageURL!)!, completionHandler: { (data, response, error) in 
         if error != nil { 
          print(error!) 
          return 
         } 
         newDog.picture = UIImage(data: data!)! 
         self.dogs.append(newDog) 
         DispatchQueue.main.async { 
          self.tableView.reloadData() 
         } 
        }).resume() 
       }) 
      } 
     }) 

     tableView.estimatedRowHeight = 454 
    } 

    // MARK: - Table view data source 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return dogs.count + 1 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     if indexPath.row == 0 { 
      let profileCell = tableView.dequeueReusableCell(withIdentifier: "profileCell", for: indexPath) as! ProfileTableViewCell 
      profileCell.nameLabel.text = user.name 
      profileCell.totalReputationLabel.text = String(describing: user.reputation!) 
      profileCell.usernameLabel.text = user.username 
      return profileCell 
     } else { 
      let dogCell = tableView.dequeueReusableCell(withIdentifier: "dogCell", for: indexPath) as! DogTableViewCell 
      dogCell.dogBreedLabel.text = dogs[indexPath.row].breed 
      dogCell.dogNameLabel.text = dogs[indexPath.row].name 
      dogCell.dogScoreLabel.text = String(describing: dogs[indexPath.row].score) 
      dogCell.dogImageView.image = dogs[indexPath.row].picture 
      dogCell.dogCreatorButton.titleLabel?.text = dogs[indexPath.row].creator 
      dogCell.dogVotesLabel.text = "0" 
      return dogCell 
     } 

    } 
} 
+0

Warum Sie eine 'profileCell' lokale Variable haben in' viewDidLoad() ', wenn Sie (richtig) in die Zelle dynamisch in' Tableview erhalten (_, cellForRowAt:) '? – NRitH

+0

Und haben Sie verifiziert, dass die erwartete Anzahl von Hunden aus der Datenbank zurückgegeben wird? – NRitH

+0

@NRitH guten Fang! Ich habe keine Ahnung, warum es eine Profilzelleneigenschaft in der Klasse gibt. Ich werde es entfernen. Und ja, ich habe überprüft, dass die Hunde korrekt zurückgegeben werden. Danke für Ihre Hilfe. –

Antwort

0

Ich fand eine Lösung kurz nach dieser Frage zu schreiben, aber ich denke, es könnte hilfreich sein, für andere zu lesen.

Da der erste IndexPath.row einer Profilzelle zugewiesen ist, hätte ich den IndexPath.row nicht zum Navigieren in meinem Hunde-Array verwenden sollen. Stattdessen hätte ich indexPath.row - 1 verwenden müssen, um den richtigen Index der Hunde zu erhalten.

Hier ist der Abschnitt I aktualisiert:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     if indexPath.row == 0 { 
      let profileCell = tableView.dequeueReusableCell(withIdentifier: "profileCell", for: indexPath) as! ProfileTableViewCell 
      profileCell.nameLabel.text = user.name 
      profileCell.totalReputationLabel.text = String(describing: user.reputation!) 
      profileCell.usernameLabel.text = user.username 
      return profileCell 
     } else { 
      let dogCell = tableView.dequeueReusableCell(withIdentifier: "dogCell", for: indexPath) as! DogTableViewCell 
      dogCell.dogBreedLabel.text = dogs[indexPath.row - 1].breed 
      dogCell.dogNameLabel.text = dogs[indexPath.row - 1].name 
      dogCell.dogScoreLabel.text = String(describing: dogs[indexPath.row - 1].score) 
      dogCell.dogImageView.image = dogs[indexPath.row - 1].picture 
      dogCell.dogCreatorButton.titleLabel?.text = dogs[indexPath.row - 1].creator 
      dogCell.dogVotesLabel.text = "0" 
      return dogCell 
     } 

    } 
Verwandte Themen