Implementierung der Artikelübersicht

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

  • Implementierung der Artikelübersicht

    Hallo,
    ich möchte mit einer App für das iPhone in einer Tabelle neue Artikel anlegen und löschen.
    Dabei habe ich 2 Probleme, die ich nicht in den Griff bekomme.

    1. Wenn ich einen neuen Artikel anlege wird er nicht direkt in der ÜbersichtsTabelle angezeigt, sondern erst, nachdem ich entweder die Detailansicht aufgerufen habe und wieder zurück zur Übersicht wechsle oder wenn ich die App beende und neu starte. Mein Ziel ist es jedoch, direkt beim Klick auf den "neuenArtikel"-Button diesen dann umgehend in der Tabelle anzuzeigen.

    2. Wenn ich einen Artikel lösche, stürzt die App ab. Nach einem Neustart der App ist der entsprechende Eintrag aber aus der Ansicht gelöscht. Ziel ist es wie bei Problem 1 ohne Absturz den gelöschten Eintrag umgehend nach Klick aus der View zu entfernen.


    Auszug aus ArtikelÜbersichtController.m

    Quellcode

    1. - (void)viewWillAppear:(BOOL)animated
    2. {
    3. [super viewWillAppear:animated];
    4. NSError *error;
    5. if(![self.fetchedResultsController performFetch:&error])
    6. {
    7. NSLog(@"Hier gab es einen Fehler");
    8. return;
    9. }
    10. [self.tableView reloadData];
    11. }
    12. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    13. {
    14. NSArray *sections = [fetchedResultsController sections];
    15. NSUInteger count = 0;
    16. if([sections count])
    17. {
    18. id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:section];
    19. count = [sectionInfo numberOfObjects];
    20. }
    21. // Return the number of rows in the section.
    22. return count;
    23. }
    24. - (IBAction)neuerArtikel
    25. {
    26. // Erzeuge Artikel
    27. NSEntityDescription *artikelDescription = [[fetchedResultsController fetchRequest] entity];
    28. NSManagedObject *newArtikel = [NSEntityDescription
    29. insertNewObjectForEntityForName:[artikelDescription name]
    30. inManagedObjectContext:managedObjectContext];
    31. // Befülle Artikel mit Standardwerten
    32. [newArtikel setValue:NSLocalizedString(@"neuerArtikel",nil) forKey:@"titel"];
    33. [newArtikel setValue:[NSDate date] forKey:@"datum"];
    34. [newArtikel setValue:[[NSUserDefaults standardUserDefaults] stringForKey:@"autor"] forKey:@"autor"];
    35. // Speichere Artikel
    36. NSError *error;
    37. if(![managedObjectContext save:&error])
    38. {
    39. NSLog(@"Fehler beim Anlegen eines neuen Artikels");
    40. }
    41. // Table View aktualisieren
    42. [self.tableView reloadData];
    43. }
    Alles anzeigen


    Ich bin Anfänger in der App-Programmierung, ich bitte also um Nachsicht.
    Dieses Beispiel stammt aus meinem ersten TutorialBuch für SDK3 und ist 1zu1 übernommen und selbst, wenn ich die auf DVD mitgelieferten Dateien, die eigentlich funktionieren sollten, benutze, sind die selben Probleme da.
    Ich benutze XCode 3.2.3.

    Ich bitte um Hilfe...
  • orthmac schrieb:

    Mein Ziel ist es jedoch, direkt beim Klick auf den "neuenArtikel"-Button diesen dann umgehend in der Tabelle anzuzeigen.

    Du musst Deiner TableView auch mitteilen, dass sich etwas geändert hat: developer.apple.com/iphone/lib…c/uid/TP40006943-CH3-SW53

    orthmac schrieb:

    Wenn ich einen Artikel lösche, stürzt die App ab.

    Was steht denn in der Konsole und wo bleibt der Debugger stehen?
    „Meine Komplikation hatte eine Komplikation.“
  • macmoonshine schrieb:

    Was steht denn in der Konsole und wo bleibt der Debugger stehen?

    Die TerminalMeldung sieht so aus

    Quellcode

    1. [Session started at 2010-09-01 12:42:06 +0200.]
    2. 2010-09-01 12:42:23.339 WeblogClientTouch[480:207] *** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1145.66/UITableView.m:827
    3. 2010-09-01 12:42:23.340 WeblogClientTouch[480:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted).'
    4. 2010-09-01 12:42:23.340 WeblogClientTouch[480:207] Stack: (
    5. 44185680,
    6. 45343532,
    7. 43923211,
    8. 811796,
    9. 3420624,
    10. 3355599,
    11. 31941,
    12. 3347297,
    13. 2993390,
    14. 3490878,
    15. 3500224,
    16. 3495021,
    17. 3120616,
    18. 3012163,
    19. 3043800,
    20. 53178748,
    21. 43464860,
    22. 43460776,
    23. 53172381,
    24. 53172578,
    25. 3036018,
    26. 9860,
    27. 9714
    28. )
    29. terminate called after throwing an instance of 'NSException'
    Alles anzeigen
  • macmoonshine schrieb:

    Du musst Deiner TableView auch mitteilen, dass sich etwas geändert hat
    mit welcher Methode deines Links soll ich das denn machen? Ich denke mal ich muss die beginUpdates und endUpdates benutzen, leider werde ich nicht daraus schlau, wie ich sie anwenden soll.


    eigentlich sollte doch in der numberOfRowsInSection die Zahl von 5 auf 4
    angepasst werden, ich verstehe nur nicht, warum das nicht passiert.
  • Man muss gerechterweise hinzufügen, dass die NSFetchedResultsController-Implementierung leider bis einschließlich OS 3.1.3 total schrottig war. Daran bin ich auch verzweifelt - gerade beim Einfügen/Bewegen/Löschen. Es waren in der Apple-Doku sogar Workarounds enthalten, um bestimmte "merkwürdige" Verhalten des Controllers zu umgehen (z.B. row-Count-Bug).

    Wenn man mal google-d, gibt es Tonnen von Implementierungen, die alle irgendwie hinfrickeln, dass der frc doch funktioniert. Eine der Besten ist von Jeff LaMarche, der ja durchaus namhaft ist.

    Ich weiß nicht, ob das in iOS 4 behoben ist.
  • Ich rufe jetzt direkt die detailseite des neuen objects auf, wenn ich den add-buton klicke. somit wäre problem 1 gelöst, aber das löschproblem besteht weiterhin. ich hab keine ahnung warum der count nicht vernünftig zählt.
    @bauwerk: das ist ne app um artikel, die hochgeladen werden können zu erstellen, bearbeiten und zu löschen.