1

ich einen iOS-App mache, aber ich erhalte immer diese Fehlermeldung:'NSInternalInconsistencyException', Grund: 'Versuch, Reihe 0 in Abschnitt einzufügen 0, aber es gibt nur 0 Abschnitte nach dem Update'

'NSInternalInconsistencyException', reason: 'attempt to insert row 0 into section 0, but there are only 0 sections after the update' 

I habe diese Frage seit 2 Tagen recherchiert, aber ich weiß nicht, was los ist. Ich setze meinen Code unten.

import UIKit 
import FirebaseDatabase 
import FirebaseAuth 

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var databaseRef = Database.database().reference() 
var loggedInUser:AnyObject? 
var loggedInUserData:NSDictionary? 

@IBOutlet weak var aivLoading: UIActivityIndicatorView! 

@IBOutlet weak var homeTableView: UITableView! 

var posts = [NSDictionary]() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.loggedInUser = Auth.auth().currentUser 

    self.databaseRef.child("users").child(self.loggedInUser!.uid).observeSingleEvent(of: .value) { (snapshot: DataSnapshot) in 

     self.loggedInUserData = snapshot.value as? NSDictionary 
     self.databaseRef.child("posts").child(self.loggedInUser!.uid).observe(.childAdded, with: { (snapshot: DataSnapshot) in 

      self.posts.insert(snapshot.value as! NSDictionary, at: 0) 
      self.homeTableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: UITableViewRowAnimation.automatic) 
      self.aivLoading.stopAnimating() 
     }){(error) in 
      ProgressHUD.showError("There was an error, try again") 
     } 
    } 

    self.homeTableView.rowHeight = UITableViewAutomaticDimension 
    self.homeTableView.estimatedRowHeight = 140 

} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return posts.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: HomeTableViewCell = tableView.dequeueReusableCell(withIdentifier: "HomeTableViewCell", for: indexPath) as! HomeTableViewCell 
    let post = posts[(self.posts.count-1) - (indexPath.row)]["text"] as! String 

    cell.configure("Anonymous", post: post) 
    return cell 
} 

} 

In meinem Code, bezieht er sich auf einen dequeueReusableCell, mit der Kennung HomeTableViewCell, die eine Swift-Datei. Hier ist der Code für die Swift-Datei:

import UIKit 
import FirebaseDatabase 
import Firebase 
import FirebaseAuth 


class HomeTableViewCell: UITableViewCell { 


    @IBOutlet weak var nameConstant: UILabel! 
    @IBOutlet weak var post: UITextView! 


    override open func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    open func configure(_ nameConstant: String, post: String) { 
     self.post.text = post 
     self.nameConstant.text = "Anonymous" 
    } 

} 

Ich weiß, gibt es ähnliche Fragen zu mir, sondern viele von ihnen sind in Objective-C. Ich habe auch die Schnellen angeschaut, aber sie helfen nicht.

Wenn jemand irgendwelche Ideen hat, das zu beheben, wäre das großartig. Danke im Voraus!

+0

Mögliche Duplikat [NSInternalInconsistencyException‘, Grund: 'Versuch, Zeile 0 in Abschnitt 0 einzufügen, aber nach dem Update gibt es in Abschnitt 0 nur 0 Zeilen' (https://stackoverflow.com/questions/11706254/nsinternalinconsistencyexception-reason-attempt-to-insert-row-0 (into-section) – DonMag

+0

Haben Sie die Delegate/Datenquelle Ihrer Tabellenansicht auf Ihren View-Controller gesetzt? – dan

+0

Wie ich DonMag sagte, ist diese Frage für Objective-C. Ich habe ein Problem in Swift. –

Antwort

0

In Ihrem Code geben Sie immer 1 für die Anzahl der Zeilen zurück. Aber ich denke, du solltest Posts zurückgeben. Jedes Mal, wenn Sie insertRows(at:... überprüfen, überprüft die Tabelle die Konsistenz über den Delegaten. Es gibt auch etwas Seltsames, Sie hängen an Ihre Liste an (self.posts.append(snapshot.value as! NSDictionary)), aber dann fügen Sie Zeile 0-0 ein? Ich nehme an, dass Sie einen neuen Beitrag an die Spitze einfügen möchten. Wenn Sie nur einen Abschnitt haben, müssen Sie die Methode nicht implementieren.

Also hier ist der Code (Ich bin die Feuerbasis und Zellkonfigurationscode unter der Annahme korrekt ist):

import UIKit 
import FirebaseDatabase 
import FirebaseAuth 

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var databaseRef = Database.database().reference() 
var loggedInUser:AnyObject? 
var loggedInUserData:NSDictionary? 

@IBOutlet weak var aivLoading: UIActivityIndicatorView! 

@IBOutlet weak var homeTableView: UITableView! 

var posts = [NSDictionary]() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.loggedInUser = Auth.auth().currentUser 

    self.databaseRef.child("users").child(self.loggedInUser!.uid).observeSingleEvent(of: .value) { (snapshot: DataSnapshot) in 

     self.loggedInUserData = snapshot.value as? NSDictionary 
     self.databaseRef.child("posts").child(self.loggedInUser!.uid).observe(.childAdded, with: { (snapshot: DataSnapshot) in 

      self.posts.insert(snapshot.value as! NSDictionary, at: 0) 
      self.homeTableView.insertRows(at: [IndexPath(row: 0, section: 0)], with: UITableViewRowAnimation.automatic) 
      self.aivLoading.stopAnimating() 
     }){(error) in 
      ProgressHUD.showError("There was an error, try again") 
     } 
    } 

    self.homeTableView.rowHeight = UITableViewAutomaticDimension 
    self.homeTableView.estimatedRowHeight = 140 

} 

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return posts.count 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: HomeTableViewCell = tableView.dequeueReusableCell(withIdentifier: "HomeTableViewCell", for: indexPath) as! HomeTableViewCell 
    let post = posts[(self.posts.count-1) - (indexPath.row)]["text"] as! String 

    cell.configure("Anonymous", post: post) 
    return cell 
} 

} 

Ich hoffe, dass es Ihr Problem behebt;)

+0

Hey, also habe ich erst jetzt eine Chance, den Code auszuprobieren, und es funktioniert immer noch nicht.Ich aktualisiere die Frage, wenn Sie nur einen Blick darauf werfen könnten, was ich falsch mache. –

+0

Sie erhalten immer noch den gleichen Fehler? Können Sie erneut überprüfen, ob Sie den Delegierten zuweisen? Denn was du Dan gesagt hast (das hat nach dem Delegierten gefragt), hängt nicht mit dem Delegierten zusammen. Nur um sicher zu gehen: Kannst du 'homeTableView.delegate = self' nur nach 'super.viewDidLoad()' machen? –

+0

Ja, ich habe es einfach gemacht und ich habe keinen Fehler bekommen. –

Verwandte Themen