Frage

Ich habe ein Coredata-Modell, das enthält Level, die wiederum childLevels enthalten.

Ich vertrete jede Ebene mit einem UITableViewController alle childLevels auflistet. Wenn ein Benutzer eine Reihe ein neues UITableViewController Abgriffe auf den navigationController geschoben. Kein Problem hier.

Wie würde ich mich über den Standort des Nutzers innerhalb dieser Tabellenstruktur zu speichern. Gibt es eine bewährte Methode, dies zu tun? Ich habe kein Problem, dies zu tun, wenn die Tiefe der Struktur bekannt war, aber irgendwie verwirrt wie man diesen Ansatz mit einer undefinierten Tiefe.

Soll ich die NSIndexPath vom Benutzer in ein Array angezapft und schreiben Sie es auf der Festplatte?

War es hilfreich?

Lösung 2

Statt die NSIndexPaths vom Benutzer angezapft der Verwendung von I mit dem zugrunde liegenden NSManagedObjects ging, die viel sicherer (bei Nummer oder Sortieren von Objekten ändern) und schneller (weil ich brauche nicht die ganze fetchRequest und oder Sicht).

ich subclassed die UINavigationController und hat die folgenden.

Wenn Sie einen neuen Tableviewcontroller für ein Niveau drücken (gespeichert in parentLevel) I anhängen dies auf ein Array in UserDefaults:

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
   [super pushViewController:viewController animated:animated];

   if([viewController isKindOfClass:[LevelTableViewController class]]){
       NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:LevelTablesPersistentKey]];
       NSManagedObject *obj = [(LevelTableViewController*)viewController parentLevel];

       if(obj!=nil){
         [array addObject:[[obj objectID].URIRepresentation absoluteString]];
       } 

       [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithArray:array] objectForKey:LevelTablesPersistentKey];

   }
}

Wenn ich ein Viewcontroller Pop entferne ich einfach den letzten Eintrag aus dem Array:

- (UIViewController *) popViewControllerAnimated:(BOOL)animated{
  UIViewController *vc = [super popViewControllerAnimated:animated];
  // remove last object
  if([vc isKindOfClass:[LevelTableViewController class]]){
     NSMutableArray *array = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:LevelTablesPersistentKey]];
     [array removeLastObject];
     [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithArray:array] objectForKey:LevelTablesPersistentKey];
  }

  return vc;
}

Ich kann dann diesen Array verwenden, wenn die Navigation initialisiert, wenn die App neben gestartet, um den Baum neu zu erstellen:

- (LevelNavigationController*) initWithRootViewController:(LevelTableViewController*)vc {
if(self = [super initWithRootViewController:vc]){
    // Recreate structure from UserDefaults
    NSArray *array = [NSArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:LevelTablesPersistentKey]];
    [[NSUserDefaults standardUserDefaults] setObject:nil forKey:LevelTablesPersistentKey]; // set the array to nil -> will be rebuild when pushing viewcontrollers onto navigation stack

    NSPersistentStoreCoordinator *persistentStoreCoordinator = ...; // pointer to coordinator 
            NSManagedObjectContext * managedObjectContext = ...; // pointer to your context
    for (NSString *objId in array) {
        NSManagedObjectID *mobjId=[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objId]];
        if(mobjId!=nil){

            NSManagedObject *obj = nil;
            NSError **err = nil;
            obj = [managedObjectContext objectWithID:mobjId];

            if(err==nil && obj){
                if([obj.entity.name isEqualToString:@"Level"]){
                    // push level

                    LevelTableViewController *nextLevel = [[LevelTableViewController alloc] initWithStyle:UITableViewStylePlain];
                    nextLevel.parentLevel = (Level*)obj;
                    [self pushViewController:nextLevel animated:NO];
                    [nextLevel release];
                } 
            } 
        }
    }

}

return self;

}

Andere Tipps

Unter Verwendung eines NSIndexPath für Ihren Zustand und Speichern / Wiederherstellen es für Ausdauer macht Sinn für mich.

Auch Ihren Ansatz - eine NSArray als Eigenschaftsliste (plist) gespeichert verwenden -. Sollte ziemlich einfach sein

Ich bin gerade fertig tue das für meine eigene App zu starten, und hier ist der Plan. Jedes Mal, wenn ein UIViewController eine neue Ansicht lädt wird den Wert in dem NSUserDefaults erstellen, die Informationen zu dieser neuen Ansicht gibt (wo es geöffnet wurde aus, welche Daten sie mit bevölkert sind, etc.). Wenn die subview kehrt löscht die View-Controller diesen Wert aus. Wenn die UIViewController hat ist es Vorlast es die Standardwerte überprüft, ob es zuvor einen Wert gespeichert, wenn ja, es die entsprechende Aktion nimmt, dass subview neu zu laden. Der Prozess wird fortgesetzt nach unten Navigationskette.

Der Grund, warum ich dies anstelle eines NSIndexPath getan haben, ist, weil zusätzlich zu der Hauptansicht Hierarchie, ich ein paar Hilfsansichten haben (hinzufügen, löschen, zu bearbeiten, etc.). Nicht nur, dass ich brauche die Öffnung dieser Ansichten zu erfassen, die außerhalb der Hauptnavigation existieren, aber sie werden eine Menge Zustand Details, die sie benötigen zu (ausgewählte Optionen, teilweise eingegebenen Text usw.) Zu speichern

Ich komme wieder hier und dies downvote wenn es sich herausstellt, ein Scheiß-Plan zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top