UITableViewController構造ドリルダウンして、ユーザーの位置を復元する方法?
-
18-09-2019 - |
質問
私は再びchildLevelsを含めることができるレベルが含まれているCoreDataのモデルを持っています。
私はすべてのchildLevelsをリストUITableViewController
と各レベルを表します。ユーザが行をタップすると、新しいUITableViewController
はnavigationController
にプッシュされます。ここで問題ありません。
どのように私はこのテーブル構造内のユーザーの場所を格納して行くでしょう。これを行うための最善の方法はありますか?私は何の問題は、構造の深さが知られていた場合は、これをやっていませんが、何とか未定義の深さでこれにアプローチする方法を困惑しています。
私は、配列の中に、ユーザがタップさNSIndexPath
を保存し、それをディスクに書き込むべきでしょうか?
解決 2
の代わりに、私は(私は全部fetchRequestおよびまたはビューを必要としないため)たくさんより安全(ケース内のオブジェクトの数やソートは変更)と高速である基礎となるNSManagedObjectsと一緒に行ったユーザーがタップさNSIndexPathsを使用します。
私はUINavigationControllerをサブクラス化し、次のことをやっています。
(parentLevel
に格納されている)レベルのための新しいTableViewControllerを押すとIは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ます。