UITableView und Core Data: Änderung einer Section wird erst nach Neustart angezeigt

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

  • UITableView und Core Data: Änderung einer Section wird erst nach Neustart angezeigt

    Hallo,

    ich habe eine Master-Detail-Application erstellt und passe diese nun an.

    Ich habe drei Entities C, E, P (Beispiel). P hat ein C und mehrere E.

    Nun möchte ich dass in meiner TableView alle E angezeigt werden (jeweils eine Row pro E) und da ein E über P mit einem C verbunden ist sollen auch Sections angezeigt werden.

    Das habe ich mit der Methode - (NSFetchedResultsController *)fetchedResultsController {...} erreichen können.

    Wenn man eine Row auswählt also ein E dann gelangt man zu einer View über die man mittels TextFields den Namen von E und C ändern kann.
    Gehe ich nach dem Ändern zurück (NavigationController) hat sich in der TableView der Name von E geändert, aber von C nicht.

    Zum testen habe ich mir in der -viewWillAppear alle C geholt und kontrolliert. Die Änderungen wurden übernommen und gespeichert, die korrekten Namen sind also vorhanden.
    Aber warum wird die TableView nicht entsprechend aktualisiert bzw. nur die Row?
    Wenn ich die App neustarte dann wurde auch die Section aktualisiert und richtig angezeigt. Aber nur nach einem echten Neustart, nicht über den Homebutton.

    Ich habe kaum was an der Master-Detail-Vorlage geändert. Der MasterViewController ist fast unverändert.

    Hat jemand einen Tip was ich kontrollieren muss?

    (Xcode und iOS auf aktuellem Stand)
  • Habe eben noch etwas festgestellt:
    Ich erwähnte ja, dass sich die Section nicht aktualisiert wenn ich diese im anderen ViewController änder. Die Row schon.
    Bisher habe ich zum testen aber nur das eine ODER andere geändert.
    Wenn ich aber beides änder, dann aktualisiert sich auch beides.
    Das heißt die Änderung von E sendet einen Aktualisierungsbefehl der beides refresht. Eine Änderung von nur C scheint dies nicht zu bewirken.
  • Ok ich habe jetzt eine Lösung.

    Bisher sah es so aus:

    - (NSFetchedResultsController *)fetchedResultsController
    {
    if (_fetchedResultsController != nil) {
    return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"E" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Set the batch size to a suitable number.
    [fetchRequest setFetchBatchSize:20];

    // Edit the sort key as appropriate.
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];
    NSArray *sortDescriptors = @[sortDescriptor];

    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc]
    initWithFetchRequest:fetchRequest
    managedObjectContext:self.managedObjectContext
    sectionNameKeyPath:@"p.c.name"
    cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
    // Replace this implementation with code to handle the error appropriately.
    // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
    }


    return _fetchedResultsController;
    }

    Jedes Mal wenn die Methode aufgerufen wurde wurde natürlich der vorhandene fetchedResultsController zurückgegeben.
    Ich habe die Methode aufgeteilt und führe den unteren Teil der einen neuen fetchedResultsController erzeugt und zurückgibt aus -viewWillAppear
    aus und danach ein reloadData. Jetzt funktioniert es wie es soll.