我有一个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这个,如果它原来是一个狗屎计划。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top