我没有使用用户点击的 NSIndexPaths,而是使用了底层的 NSManagedObjects,它更安全(以防对象的数量或排序发生变化)和更快(因为我不需要整个 fetchRequest 和/或视图)。
我将 UINavigationController 子类化并执行了以下操作。
当为一个级别(存储在parentLevel
)推送一个新的 TableViewController 时,我将它附加到 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];
}
}
当我弹出一个 viewController 时,我只需从该数组中删除最后一个条目:
- (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;
}
然后,当应用程序下一次开始重建树时,我可以在初始化 NavigationController 时使用此数组:
- (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;
}