Problem mit TableView Update

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem mit TableView Update

    Hey zusammen,

    nach längerer Pause (arbeitsbedingt) gehts jetzt endlich weiter mit der IOS Entwicklung.

    Und ich stehe vor einem Rätsel.

    Folgende Situation:

    Ich habe einen ViewController der einen TableView per Swiftcode erzeugt.

    Über einen UIButton füge ich per Alarmofire und SwiftyJSON neue TableViewCells hinzu, genau genommen
    speichere ich neue Datensätze per Webservice in der Datenbank und aktualisiere meinen TableView.

    Zusätzlich kann ich per Swipe einzelne Cells löschen.

    Durch Klick auf eine bestehende Cell wird ein zweiter ViewController aufgerufen, der mir Details anzeigt.

    Habe ich Cells gelöscht oder hinzugefügt, klappt auch hier das Update und ich kann die neue Cell anklicken.

    Bis hier hin ist alles gut.

    PROBLEM:
    Habe ich vor dem Löschen oder Hinzufügen bereits einmal eine bestehende Cell angeklickt
    (also den 2. ViewController mit den Details aufgerufen) und zwar so:

    Quellcode

    1. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    2. selectedRow = String(indexPath.row)
    3. tableView.deselectRowAtIndexPath(indexPath, animated: true)
    4. let mlDetailVC: mlShowDetailVC = self.storyboard!.instantiateViewControllerWithIdentifier("mlShowDetail") as! mlShowDetailVC
    5. mlDetailVC.listid = datastructarray[indexPath.row].id
    6. self.presentViewController(mlDetailVC, animated: true, completion: nil)
    7. }



    und ich gehe zurück aus dem 2. ViewController per:

    Quellcode

    1. @IBAction func backToListAction(sender: AnyObject) {
    2. dismissViewControllerAnimated(true, completion: nil)
    3. }

    dann funktioniert beim weiteren Hinzufügen oder Löschen die Update Funktion nicht mehr.


    Quellcode

    1. self.tableView.reloadData()

    Hat jemand eine Idee woran das liegen könnte?

    Ach so sollte das Wichtig sein, ich habe keine NavigationController nur einen Tab Bar Controller, der den 1. ViewController einbindet,
    damit ich diesen in der Tab Bar unten in der App öffnen kann.

    Der 2. ViewController ist nicht mit dem Tab Bar verknüpft.

    Ich bin gespannt und hoffe ihr habt einen Tip oder eine Richtung für mich.

    Vielen Dank und ein schönes Wochenende :thumbsup:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DKCode ()

  • Ok ich teste immer noch (jetzt bereits seit einer Woche ;( ) und versuche den Fehler zu finden.

    Ein Update der TableView ist ebenfalls nicht mehr möglich, wenn ich in der Tab Bar in einen anderen ViewController gewechselt bin und zurückspringe.

    Die Daten, die ich vom Webserver hole (die einzelnen Listennamen) werden korrekt abgerufen und auch bei den oben genannten Problemen immer im Struct geupdated.

    Quellcode

    1. struct datastruct {
    2. let id: String
    3. let listname: String
    4. }
    5. var datastructarray = [datastruct]()

    Der TableView wird in der "viewWillAppear" erstellt. In dieser Funktion rufe ich anschließend die Funktion "UpdateFromDatabase" auf,
    die wiederum die Daten per Webservice abruft und über


    Quellcode

    1. self.datastructarray.append(datastruct(id: id, name: indvItem))


    das Struct gefüllt. Anschließend update ich den TableView mit


    Quellcode

    1. self.tableView.reloadData()


    und das klappt auch solange ich den ViewController nicht wechsle.

    Was kann das bloß sein? Ich raff es nicht ;(
  • Ok ich komme der Sache näher, aber jetzt wird es komplett kurios 8|

    Wenn ich jetzt im eine neue Liste hinzufüge (also eine neue Cell) zeigt mir der TableView keine Veränderung.
    Also so wie vorher... aber wenn ich in der Liste ganz runterscrolle und wieder nach oben, dann ist die neue Cell
    plötzlich oben drüber?

    Ich fall vom Glauben ab =O

    Zuerst dachte ich das hat mit einer Verzögerung zu tun, dass durch den Webservice die Daten später ankommen.
    Aber auch habe gerade mal ein paar Minuten gewartet und es passiert nichts. Erst wenn ich ganz nach unten scrolle,
    taucht die neue Cell plötzlich oben auf.

    Meine Hoffnung war, dass das ein Fehler der IOS Testumgebung am Mac ist, aber auch auf dem iPhone passiert das gleiche.

    Hat damit jemand Erfahrungen?
  • Laut Stackoverflow haben schon viele Andere das Problem gehabt. Es soll es mit

    Quellcode

    1. dispatch_async(dispatch_get_main_queue(), { () -> Void in
    2. self.tableView.reloadData()
    3. })
    funktionieren. Aber bei mir geht es nicht.

    auch mit


    Quellcode

    1. dispatch_sync(dispatch_get_main_queue(), { () -> Void in
    2. self.tableView.reloadData()
    3. })


    funktioniert es nicht.

    Weder in meiner eigenen Update Funktion noch in der "viewWillAppear" oder in "viewDidAppear".

    Die neue Cell wird erst angezeigt, wenn ich unterscrolle. ?(
  • Ohne dass ich mich jetzt in Deinen Code einlese:
    • Wenn eine Zelle erst beim Runterscrollen die erwarteten Inhalte zeigt, könnte die Ursache ein Caching-Problem sein. Nutzt Du "reusable cells"? Leg einmal testweise grundsätzlich neue Instanzen an. Ändert sich das Verhalten?
    • Anderer Ansatz: Informierst Du denn die TableView, wenn alle Daten via WebService geladen wurden? Lausche doch z. B. auf eine Notification, die Du absetzt, sobald neue Daten vorliegen. Dann lade die Daten der TableView neu.
    Das wären die beiden ersten Dinge, die ich checken würde...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Ohne dass ich mich jetzt in Deinen Code einlese:
    • Wenn eine Zelle erst beim Runterscrollen die erwarteten Inhalte zeigt, könnte die Ursache ein Caching-Problem sein. Nutzt Du "reusable cells"? Leg einmal testweise grundsätzlich neue Instanzen an. Ändert sich das Verhalten?
    • Anderer Ansatz: Informierst Du denn die TableView, wenn alle Daten via WebService geladen wurden? Lausche doch z. B. auf eine Notification, die Du absetzt, sobald neue Daten vorliegen. Dann lade die Daten der TableView neu.
    Das wären die beiden ersten Dinge, die ich checken würde...

    Mattes
    Ja ich gehe auch von einem Caching-Problem aus aber damit kenn ich mich leider noch nicht so wirklich gut aus.

    Mit "reusable cells" kann ich gerade nicht so viel anfangen muss das gleich mal nachlesen was das genau ist.

    Wenn neue Daten geladen werden, also per Alarmofire, habe ich den reloadData direkt danach gesetzt, um mal zu gucken was passiert. Das Array, welcher das Struct enthält hat die neuen Daten,
    das kann ich per print sehen, aber der TableView updated diese anscheint nicht sichtbar sondern nur im Hintergrund. Scrollt man dann runter scheint die TableView sich "sichtbar" zu updaten.

    Wie genau meinst du das mit einer Notification?

    Sorry wenn ich manchmal blöde Fragen stelle, aber ich komm aus der Webentwicklung und beschäftige mich noch nicht all zu lange mit Swift / Xcode. Man lernt ja nie aus!
  • Michael schrieb:

    DKCode schrieb:

    Der TableView wird in der "viewWillAppear" erstellt.
    Äh, was heißt das genau? „viewWillAppear:“ wird immer aufgerufen, wenn der View wieder erscheint. Also wenn du deinen zweiten ViewController verlässt, wird „viewWillAppear:“ aufgerufen. Ich könnte mir also vorstellen, dass deine „viewWillAppear:“ Methode das Problem ist. Zeig die mal.
    Genau das hatte ich per print gesehen und dachte ok dann setz ich da auch die reloadData Funktion rein und alles müsste gehen. Leider aber nicht.

    Der Code ist dieser:

    Quellcode

    1. override func viewWillAppear(animated: Bool) {
    2. /************************************************************************
    3. CREATE TABLEVIEW
    4. ************************************************************************/
    5. let frame:CGRect = CGRect(x: 0, y: 80, width: self.view.frame.width, height: self.view.frame.height-100)
    6. self.tableView = UITableView(frame: frame)
    7. self.tableView.dataSource = self
    8. self.tableView.delegate = self
    9. self.tableView.backgroundColor = UIColor.clearColor()
    10. self.view.addSubview(self.tableView)
    11. self.view.sendSubviewToBack(self.tableView);
    12. self.tableView.layoutMargins = UIEdgeInsetsZero
    13. self.tableView.separatorInset = UIEdgeInsetsZero
    14. //self.tableView.reloadData()
    15. /************************************************************************
    16. CREATE BUTTON "NEW LIST"
    17. ************************************************************************/
    18. let button = UIButton(frame: CGRect(x: self.view.frame.width - 160, y: 20, width: 160, height: 50))
    19. button.setTitle("Neue Liste", forState: .Normal)
    20. button.addTarget(self, action: #selector(buttonNeueListeAction), forControlEvents: .TouchUpInside)
    21. button.setLeftImage("icon_addNewList", padding: 10.0)
    22. self.view.addSubview(button)
    23. /************************************************************************
    24. GET USERID
    25. ************************************************************************/
    26. let uid = User.currentUser.uid
    27. /************************************************************************
    28. UPDATE TABLEVIEW
    29. ************************************************************************/
    30. updateTableView(uid!)
    31. //self.tableView.reloadData()
    32. /************************************************************************
    33. ADD VIEW-BACKGROUND
    34. ************************************************************************/
    35. self.view.addBackground2()
    36. }
    Alles anzeigen


    Und die UpdateTableView() Funktion die die Daten lädt und dann reloaded.


    Quellcode

    1. /************************************************************************
    2. UPDATE TABLEVIEW
    3. ************************************************************************/
    4. func updateTableView(uid:String){
    5. Alamofire.request(.POST, "https://api.meinwebservice/", parameters: ["u": uid, "r": "getUL"])
    6. .responseJSON { response in
    7. guard response.result.error == nil else {
    8. // got an error in getting the data, need to handle it
    9. print("error calling POST on Webservice")
    10. print(response.result.error!)
    11. return
    12. }
    13. guard let value = response.result.value else {
    14. print("no result data received when calling POST on Webservice")
    15. return
    16. }
    17. let todo = JSON(value)
    18. let countLists = todo.count
    19. var alllists = 0;
    20. while alllists < countLists
    21. {
    22. guard let title = todo[alllists]["ln"].string else {
    23. return
    24. }
    25. guard let id = todo[alllists]["id"].string else {
    26. return
    27. }
    28. guard let created = todo[alllists]["cr"].string else {
    29. return
    30. }
    31. let indvItem = title
    32. self.datastructarray.append(datastruct(id: id, name: indvItem))
    33. alllists += 1
    34. }
    35. self.tableView.reloadData()
    36. }
    37. }
    Alles anzeigen

    Vielleicht kannst du da ja etwas rauslesen :thumbsup:
  • Wenn Du in den Code schaust, wo Du die Zellen instanzierst, wirst Du (höchstwahrscheinlich) einen Methodenaufruf finden, der über einen Identifier eine Zelle anfordert. Hierbei werden bereits allokierte, aber ungenutzte Zellen (z. B. aufgrund von Scrollen) erneut verwendet. Wenn diese hierbei nicht sauber konfiguriert werden, hast Du alte Inhalte, altes Layout oder ähnliches. Erst wenn durch massives Scrollen wirklich neue Zellen instanzierst werden, ziehen Schritte, die Du vielleicht fälschlicherweise nur beim Anlegen von Zellen durchführtest. Das ist jetzt aber echt Kaffeesatzlesen...

    Notifications sind ein Verfahren, unabhängige, evt. sogar unbekannte Objekte über ein Ereignis zu informieren. So kann eine Klasse zur Datenhaltung / -aktualisierung z. B. in die Welt posaunen, dass die Daten aktualisiert wurden. Ohne dass sie wissen muss, wer alles auf diese Nachricht reagiert. Schau einfach mal nach NSNotification, damit kann man recht einfach sehr coole Sachen machen. Aber auch hier Kaffeesatzlesen. Nur irgendwie muss Deine Tabelle ja erfahren, dass sie sich neue Daten holen soll...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Wenn Du in den Code schaust, wo Du die Zellen instanzierst, wirst Du (höchstwahrscheinlich) einen Methodenaufruf finden, der über einen Identifier eine Zelle anfordert. Hierbei werden bereits allokierte, aber ungenutzte Zellen (z. B. aufgrund von Scrollen) erneut verwendet. Wenn diese hierbei nicht sauber konfiguriert werden, hast Du alte Inhalte, altes Layout oder ähnliches. Erst wenn durch massives Scrollen wirklich neue Zellen instanzierst werden, ziehen Schritte, die Du vielleicht fälschlicherweise nur beim Anlegen von Zellen durchführtest. Das ist jetzt aber echt Kaffeesatzlesen...

    Notifications sind ein Verfahren, unabhängige, evt. sogar unbekannte Objekte über ein Ereignis zu informieren. So kann eine Klasse zur Datenhaltung / -aktualisierung z. B. in die Welt posaunen, dass die Daten aktualisiert wurden. Ohne dass sie wissen muss, wer alles auf diese Nachricht reagiert. Schau einfach mal nach NSNotification, damit kann man recht einfach sehr coole Sachen machen. Aber auch hier Kaffeesatzlesen. Nur irgendwie muss Deine Tabelle ja erfahren, dass sie sich neue Daten holen soll...

    Mattes
    Ah ok Danke für die ausführliche Erklärung! :thumbsup:

    Also meine TableView Funktionen sehen so aus:

    Quellcode

    1. /************************************************************************
    2. TABLE VIEW
    3. ************************************************************************/
    4. func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    5. return datastructarray.count
    6. }
    7. func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    8. var cell = tableView.dequeueReusableCellWithIdentifier("CELL")
    9. if cell == nil {
    10. cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "CELL")
    11. }
    12. cell!.textLabel!.text = datastructarray[indexPath.row].name as String + " | " + String(indexPath.row)
    13. cell!.layoutMargins = UIEdgeInsetsZero;
    14. cell!.textLabel!.textColor = UIColor.whiteColor();
    15. cell!.accessoryType = .DisclosureIndicator
    16. let image : UIImage = UIImage(named: "icon_list_final")!
    17. cell!.imageView!.image = image
    18. return cell!
    19. }
    20. func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    21. return 100
    22. }
    23. func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    24. cell.backgroundColor = .grayColor()
    25. cell.alpha = 0.5
    26. }
    27. func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    28. return true
    29. }
    30. func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    31. if (editingStyle == UITableViewCellEditingStyle.Delete) {
    32. let uid = User.currentUser.uid
    33. deleteList(uid!, listid: self.datastructarray[indexPath.row].id as String)
    34. }
    35. }
    36. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    37. selectedRow = String(indexPath.row)
    38. tableView.deselectRowAtIndexPath(indexPath, animated: true)
    39. let mlDetailVC: mlShowDetailVC = self.storyboard!.instantiateViewControllerWithIdentifier("mlShowDetail") as! mlShowDetailVC
    40. mlDetailVC.listid = datastructarray[indexPath.row].id
    41. self.presentViewController(mlDetailVC, animated: true, completion: nil)
    42. }
    Alles anzeigen
    Kannst du da etwas entdecken was schief läuft?

    Viele Dank für eure Unterstützung!
  • DKCode schrieb:

    Der Code ist dieser:

    Quellcode

    1. override func viewWillAppear(animated: Bool) {
    2. /************************************************************************
    3. CREATE TABLEVIEW
    4. ************************************************************************/
    5. let frame:CGRect = CGRect(x: 0, y: 80, width: self.view.frame.width, height: self.view.frame.height-100)
    6. self.tableView = UITableView(frame: frame)
    7. self.tableView.dataSource = self
    8. self.tableView.delegate = self
    9. self.tableView.backgroundColor = UIColor.clearColor()
    10. self.view.addSubview(self.tableView)
    11. self.view.sendSubviewToBack(self.tableView);
    12. self.tableView.layoutMargins = UIEdgeInsetsZero
    13. self.tableView.separatorInset = UIEdgeInsetsZero
    14. //self.tableView.reloadData()
    15. /************************************************************************
    16. CREATE BUTTON "NEW LIST"
    17. ************************************************************************/
    18. let button = UIButton(frame: CGRect(x: self.view.frame.width - 160, y: 20, width: 160, height: 50))
    19. button.setTitle("Neue Liste", forState: .Normal)
    20. button.addTarget(self, action: #selector(buttonNeueListeAction), forControlEvents: .TouchUpInside)
    21. button.setLeftImage("icon_addNewList", padding: 10.0)
    22. self.view.addSubview(button)
    23. /************************************************************************
    24. GET USERID
    25. ************************************************************************/
    26. let uid = User.currentUser.uid
    27. /************************************************************************
    28. UPDATE TABLEVIEW
    29. ************************************************************************/
    30. updateTableView(uid!)
    31. //self.tableView.reloadData()
    32. /************************************************************************
    33. ADD VIEW-BACKGROUND
    34. ************************************************************************/
    35. self.view.addBackground2()
    36. }
    Alles anzeigen
    Das habe ich befürchtet. Jedesmal, wenn dein View wieder angezeigt wird, erstellst du einen weiteren TableView und fügst den der Viewhierarchie hinzu. Du stapelst also TableViews. Nimm mal die Zeilen 2 bis 22, sowie 32 bis 35 raus und implementiere die in loadView():

    Quellcode

    1. override func loadView() {
    2. super.loadView()
    3. /************************************************************************
    4. CREATE TABLEVIEW
    5. ************************************************************************/
    6. let frame:CGRect = CGRect(x: 0, y: 80, width: self.view.frame.width, height: self.view.frame.height-100)
    7. self.tableView = UITableView(frame: frame)
    8. self.tableView.dataSource = self
    9. self.tableView.delegate = self
    10. self.tableView.backgroundColor = UIColor.clearColor()
    11. self.view.addSubview(self.tableView)
    12. self.view.sendSubviewToBack(self.tableView);
    13. self.tableView.layoutMargins = UIEdgeInsetsZero
    14. self.tableView.separatorInset = UIEdgeInsetsZero
    15. /************************************************************************
    16. CREATE BUTTON "NEW LIST"
    17. ************************************************************************/
    18. let button = UIButton(frame: CGRect(x: self.view.frame.width - 160, y: 20, width: 160, height: 50))
    19. button.setTitle("Neue Liste", forState: .Normal)
    20. button.addTarget(self, action: #selector(buttonNeueListeAction), forControlEvents: .TouchUpInside)
    21. button.setLeftImage("icon_addNewList", padding: 10.0)
    22. self.view.addSubview(button)
    23. /************************************************************************
    24. ADD VIEW-BACKGROUND
    25. ************************************************************************/
    26. self.view.addBackground2()
    27. }
    Alles anzeigen
  • Ist das zu glauben?

    Ich habe gerade noch mal alle möglichen Sachen getestet und siehe da ich habe den Fehler gefunden ;( :thumbsup:

    Die Erstellung der TableView musste aus der "ViewWillAppear" in die "ViewDidLoad" Funktion. Alter echt eine Woche
    so viel Code wie schon seit langem nicht mehr geschrieben / umgeschrieben, recherchiert und getestet und dann ist es
    so simple. Natürlich hatte ich das in der ganzen Zeit nicht einmal versucht, da die TableView Ansicht ja lief und auch alles
    angezeigt hatte. Manchmal ist man einfach blind.

    Ich danke euch für die Denkanstöße und Hilfe! Es geht endlich weiter :thumbsup:
  • Michael schrieb:

    DKCode schrieb:

    Der Code ist dieser:

    Quellcode

    1. override func viewWillAppear(animated: Bool) {
    2. /************************************************************************
    3. CREATE TABLEVIEW
    4. ************************************************************************/
    5. let frame:CGRect = CGRect(x: 0, y: 80, width: self.view.frame.width, height: self.view.frame.height-100)
    6. self.tableView = UITableView(frame: frame)
    7. self.tableView.dataSource = self
    8. self.tableView.delegate = self
    9. self.tableView.backgroundColor = UIColor.clearColor()
    10. self.view.addSubview(self.tableView)
    11. self.view.sendSubviewToBack(self.tableView);
    12. self.tableView.layoutMargins = UIEdgeInsetsZero
    13. self.tableView.separatorInset = UIEdgeInsetsZero
    14. //self.tableView.reloadData()
    15. /************************************************************************
    16. CREATE BUTTON "NEW LIST"
    17. ************************************************************************/
    18. let button = UIButton(frame: CGRect(x: self.view.frame.width - 160, y: 20, width: 160, height: 50))
    19. button.setTitle("Neue Liste", forState: .Normal)
    20. button.addTarget(self, action: #selector(buttonNeueListeAction), forControlEvents: .TouchUpInside)
    21. button.setLeftImage("icon_addNewList", padding: 10.0)
    22. self.view.addSubview(button)
    23. /************************************************************************
    24. GET USERID
    25. ************************************************************************/
    26. let uid = User.currentUser.uid
    27. /************************************************************************
    28. UPDATE TABLEVIEW
    29. ************************************************************************/
    30. updateTableView(uid!)
    31. //self.tableView.reloadData()
    32. /************************************************************************
    33. ADD VIEW-BACKGROUND
    34. ************************************************************************/
    35. self.view.addBackground2()
    36. }
    Alles anzeigen
    Das habe ich befürchtet. Jedesmal, wenn dein View wieder angezeigt wird, erstellst du einen weiteren TableView und fügst den der Viewhierarchie hinzu. Du stapelst also TableViews. Nimm mal die Zeilen 2 bis 22, sowie 32 bis 35 raus und implementiere die in loadView():

    Quellcode

    1. override func loadView() {
    2. super.loadView()
    3. /************************************************************************
    4. CREATE TABLEVIEW
    5. ************************************************************************/
    6. let frame:CGRect = CGRect(x: 0, y: 80, width: self.view.frame.width, height: self.view.frame.height-100)
    7. self.tableView = UITableView(frame: frame)
    8. self.tableView.dataSource = self
    9. self.tableView.delegate = self
    10. self.tableView.backgroundColor = UIColor.clearColor()
    11. self.view.addSubview(self.tableView)
    12. self.view.sendSubviewToBack(self.tableView);
    13. self.tableView.layoutMargins = UIEdgeInsetsZero
    14. self.tableView.separatorInset = UIEdgeInsetsZero
    15. /************************************************************************
    16. CREATE BUTTON "NEW LIST"
    17. ************************************************************************/
    18. let button = UIButton(frame: CGRect(x: self.view.frame.width - 160, y: 20, width: 160, height: 50))
    19. button.setTitle("Neue Liste", forState: .Normal)
    20. button.addTarget(self, action: #selector(buttonNeueListeAction), forControlEvents: .TouchUpInside)
    21. button.setLeftImage("icon_addNewList", padding: 10.0)
    22. self.view.addSubview(button)
    23. /************************************************************************
    24. ADD VIEW-BACKGROUND
    25. ************************************************************************/
    26. self.view.addBackground2()
    27. }
    Alles anzeigen

    Ja du hattest sowas von recht ! Hammer zwei Sekunden bevor ich deine Antwort gelesen habe hatte ich es auch gerade herausgefunden 8o

    Vielen Dank für deine Unterstützung :thumbsup: