如何恢复用户的位置,在下钻UITableViewController结构?
-
18-09-2019 - |
题
我有一个CoreData模型包含的水平,这可以再次包含childLevels.
我所代表的每个级别的有一个 UITableViewController
清单的所有childLevels.当用户水龙头的行一个新的 UITableViewController
被推到 navigationController
.没问题这里。
我怎么会去存储用户的位置,这表的结构。是有一个最好的实践中这样做?我没有问题这样做,如果深入的结构是众所周知的,但某种方式不解如何处理这一不确定的深度。
我应该商店的 NSIndexPath
窃听过的用户进入一个数组,并写入磁盘?
解决方案 2
而不是使用NSIndexPaths利用的用户我去了与基础NSManagedObjects这是一个很大的安全(情况下的数量或排序的对象的变化)和更快的(因为我不需要整个fetchRequest和或图)。
我的子类的UINavigationController和做以下。
当推动一个新的TableViewController一级(储存在 parentLevel
)我追加这一系列在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;
}
其他提示
使用你的状态NSIndexPath
和保存/恢复它的持久性对我来说很有意义。
另外你的方法 - 使用存储为属性列表(plist中)一个NSArray - 应该是相当简单
我正要准备开始这样做了我自己的应用程序,这里的计划。一个UIViewController加载一个新视图,将创建在该报告中有新的视图信息的一个NSUserDefaults的值每次(它被从打开,它与人口数据等)。当子视图返回视图控制器清除了该值。当的UIViewController有它的初始加载它检查默认值,看它是否先前存储的一个值,如果是这样,它采取适当的动作来重新加载子视图。该过程继续向下导航链。
我做这个代替NSIndexPath的原因是因为,在除了主视图层次结构,我有一束辅助视图(添加,删除,编辑等)。我不仅需要记录中存在的主要导航外,这些意见的开放,但他们将有很多的细节状态,他们需要保存太(选择的选项,部分输入的文本,等等。)
我会回来这里downvote这个,如果它原来是一个狗屎计划。