2012-11-28 28 views
8

Ich habe eine App, die UIKit Zustandserhaltung in iOS 6 verwendet. Ich bin in der Lage zu speichern/wiederherstellen den Zustand der Ansicht Controller, dh welche Registerkarte ausgewählt ist und Navigation Controller-Hierarchie, aber ich Meine Tabellenansicht kann nicht wiederhergestellt werden. Ich habe eine Restauration Kennung in meinem Drehbuch für die Ansicht sowie die View-Controller und den View-Controller (die Datenquelle des Tabelle) implementiert UIDataSourceModelAssociation wie folgt:UIKit Zustandserhaltung nicht Scroll-Offset wiederherstellen

- (NSString *)modelIdentifierForElementAtIndexPath:(NSIndexPath *)indexPath inView:(UIView *)view 
{ 
    TSStatus *status = [self._fetchedResultsController objectAtIndexPath:indexPath]; 

    return status.objectID.URIRepresentation.absoluteString; 
} 

- (NSIndexPath *)indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view 
{ 
    NSURL *statusURL = [NSURL URLWithString:identifier]; 
    NSManagedObjectID *statusID = [[TSDataController sharedController].persistentStoreCoordinator managedObjectIDForURIRepresentation:statusURL]; 
    TSStatus *status = (TSStatus *)[[TSDataController sharedController].mainContext objectWithID:statusID]; 

    return [__fetchedResultsController indexPathForObject:status]; 
} 

modelIdentifierForElementAtIndexPath:inView: aufgerufen wurden, wenn die App geht in den Hintergrund aber modelIdentifierForElementAtIndexPath:inView: wird nie aufgerufen.

+1

Ich nehme an, Ihr schließender Absatz ist ein Tippfehler? --- "modelIdentifierForElementAtIndexPath: inView: wird aufgerufen, wenn die App in den Hintergrund tritt, jedoch modelIdentifierForElementAtIndexPath: inView: wird nie aufgerufen." – Daniel

Antwort

2

Dies ist keine echte Antwort auf Ihre Frage, aber ich war nicht in der Lage, eine Tabelle zu erhalten, stellen Sie ihre contentOffset, entweder.

Ich denke, das ist ein Fehler in iOS 6, weil die Dokumentation eindeutig besagt, dass ein UITableView sein Content wieder her, wenn 1) einen restorationIdentifier 2) die View-Controller hat die Ansicht gehört hat ein restorationIdentifier und 3) die Daten Quelle entspricht dem UIDataSourceModelAssociation Protokoll.

Sie können den Content und das ausgewählte Elements manuell in Ihren View-Controller wiederherstellen, aber:

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super encodeRestorableStateWithCoder:coder]; 

    [coder encodeObject:[NSValue valueWithCGPoint:self.tableView.contentOffset] forKey:@"tableView.contentOffset"]; 

    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
    if (indexPath != nil) { 
     NSString *modelIdentifier = [self modelIdentifierForElementAtIndexPath:indexPath inView:self.tableView]; 
     [coder encodeObject:modelIdentifier forKey:@"tableView.selectedModelIdentifier"]; 
    } 
} 

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder 
{ 
    [super decodeRestorableStateWithCoder:coder]; 

    CGPoint contentOffset = [[coder decodeObjectForKey:@"tableView.contentOffset"] CGPointValue]; 
    self.tableView.contentOffset = contentOffset; 

    NSString *modelIdentifier = [coder decodeObjectForKey:@"tableView.selectedModelIdentifier"]; 
    if (modelIdentifier != nil) { 
     NSIndexPath *indexPath = [self indexPathForElementWithModelIdentifier:modelIdentifier inView:self.tableView]; 
     if (indexPath != nil) { 
      [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
     } 
    } 
} 

Ich habe keine Ahnung, warum UITableView nicht automatisch tut, obwohl die Dokumentation sagt, es tut. Wenn jemand die Antwort kennt, bitte Kommentar.

3

Ich habe gefunden, das kann funktionieren, wenn die UITableView auch eine Wiederherstellung Identifier Set hat.

Es funktioniert jedoch nicht, wenn der UITableViewController in einem UINavigationController ist. Dies wurde Apple gemeldet, Problem ID: 13536778. Dieses Problem scheint auf iOS 6.0 und 6.1.3 auftreten.

+0

Tabelle in navigationController: sieht aus wie immer noch ein Fehler in iOS9 – Jaro

2

Dies ist ein Fehler in iOS 6.

Um Zustand Wiederherstellung für Ihre Tabellenansicht Arbeiten mit dem UIDataSourceModelAssociation Protokoll erhalten Sie -reloadData auf Tabellenansicht aufrufen sollten, bevor die gültige Indexpfad in -indexPathForElementWithModelIdentifier:inView: wie so Rückkehr:

- (NSIndexPath *)indexPathForElementWithModelIdentifier:(NSString *)identifier inView:(UIView *)view 
{ 
    NSURL *statusURL = [NSURL URLWithString:identifier]; 
    NSManagedObjectID *statusID = [[TSDataController sharedController].persistentStoreCoordinator managedObjectIDForURIRepresentation:statusURL]; 
    TSStatus *status = (TSStatus *)[[TSDataController sharedController].mainContext objectWithID:statusID]; 

    [self.tableView reloadData]; 

    return [__fetchedResultsController indexPathForObject:status]; 
} 
+0

danke für diesen! –

+0

Dieser Fehler scheint mit iOS 7 behoben zu sein. Ich muss reloadData nicht mehr aufrufen, um den Status für eine Tabellenansicht wiederherzustellen. – bilobatum

Verwandte Themen