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
}
}
}
Warum Sie eine 'profileCell' lokale Variable haben in' viewDidLoad() ', wenn Sie (richtig) in die Zelle dynamisch in' Tableview erhalten (_, cellForRowAt:) '? – NRitH
Und haben Sie verifiziert, dass die erwartete Anzahl von Hunden aus der Datenbank zurückgegeben wird? – NRitH
@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. –