كيفية استعادة موقع المستخدم في حفر أسفل هيكل AuatedViewController؟

StackOverflow https://stackoverflow.com/questions/2203393

سؤال

لدي نموذج Coredata يحتوي على مستويات يمكن أن تحتوي مرة أخرى على endlylevels.

أنا أمثل كل مستوى مع UITableViewController سرد جميع الأطفال. عندما ينص المستخدم على صف جديد UITableViewController يتم دفعها على navigationController. وبعد لا مشكلة هنا.

كيف أذهب حول تخزين موقع المستخدم داخل هيكل هذا الجدول. هل هناك أفضل الممارسات للقيام بذلك؟ ليس لدي أي مشكلة في القيام بذلك إذا كان عمق الهيكل معروفا، لكن بطريقة ما في حالة حيرة كيفية الاقتراب من ذلك بعمق غير محدد.

يجب علي تخزين NSIndexPath استغلاله من قبل المستخدم في صفيف واكتبه إلى القرص؟

هل كانت مفيدة؟

المحلول 2

بدلا من استخدام nsindexpaths تم استغلالها بواسطة المستخدم الذي ذهبت إليه مع NSManagedObjects الأساسي الذي هو أكثر أمانا (في حالة الحال أو فرز الكائنات التي تتغير) وأسرع (لأنني لا أحتاج إلى fetchrequest أو عرض كامل).

أنا فرعية uinavigationcontroller وفعل ما يلي.

عند دفع جدول طاولة جديدة إلى مستوى (مخزن في 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;

}

نصائح أخرى

باستخدام an. NSIndexPath لحالتك وحفظ / استعادة ذلك للحصول على الثبات المنطقي بالنسبة لي.

أيضا نهجك - لاستخدام NSArray المخزنة كقائمة خاصية (PLIST) - يجب أن يكون واضحا إلى حد ما.

أنا فقط جاهز للبدء في القيام بذلك للحصول على تطبيقي الخاص وهنا الخطة. في كل مرة يقوم فيها UiviewController بتحميل طريقة عرض جديدة، سيقوم بإنشاء قيمة في NSUSERDEFAULTS التي توفر معلومات حول هذا العرض الجديد (حيث تم فتحه من، ما البيانات التي يتم ملؤها بها، إلخ). عند إرجاع الفرع الفرعي يعتذر وحدة التحكم "عرض" مسح هذه القيمة. عندما يكون لدى UiviewController تحميله الأولي، فهو يتحقق من الإعدادات الافتراضية لمعرفة ما إذا كان قد قمت مسبقا بتخزين قيمة، إذا كان الأمر كذلك، فسيؤدي ذلك إلى إعادة تحميل الإجراء الفرعي المناسب. تستمر العملية في سلسلة الملاحة.

السبب في أنني قمت بهذا بدلا من nsindexpath هو أنه بالإضافة إلى التسلسل الهرمي للرؤية الرئيسية، لدي مجموعة من المشاهدات المساعدة (إضافة، إزالة، تحرير، إلخ). لن أحتاج إلا إلى تسجيل افتتاح هذه الآراء الموجودة خارج الملاحة الرئيسية، لكن سيكون لديهم الكثير من التفاصيل الحكومية التي يحتاجون إليها لحفظ (خيارات محددة، نص دخل جزئيا، إلخ)

سأعود إلى هنا وأسفل هذا إذا اتضح أن تكون خطة القرف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top