iphone - recuperar - Conservación del estado de iOS y vistas de contenedor
ver notificaciones antiguas iphone (2)
Creo que la respuesta está en la documentation Se dice:
"La clase UIViewController guarda una referencia al controlador de vista presentado y al guión gráfico (si existe) que se usó para crear el controlador de vista. El controlador de vista también solicita a las vistas en su jerarquía de vistas para guardar cualquier información relevante. Sin embargo, esta clase no guarda automáticamente las referencias a los controladores de vista secundaria contenidos. Si está implementando un controlador de vista de contenedor personalizado, debe codificar usted mismo los objetos del controlador de vista secundaria si desea que se conserven " .
Así que podrías hacer algo así:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder {
[super encodeRestorableStateWithCoder:coder];
[self.myChildViewController encodeRestorableStateWithCoder:coder];
}
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder {
[super decodeRestorableStateWithCoder:coder];
[self.myChildViewController decodeRestorableStateWithCoder:coder];
}
Y en MyChildViewController no llames super :)
Tengo un controlador de vista en un guión gráfico que utiliza una vista de contenedor. Ambos tienen identificadores de restauración establecidos. El padre se está guardando y restaurando muy bien. El niño sin embargo no lo es. No se está -encodeRestorableStateWithCoder:
o -decodeRestorableStateWithCoder:
en el controlador de vista secundario.
¿Cuál es la forma correcta de guardar los controladores de vista secundarios que se crean con un contenedor de vista? Puedo guardar el controlador de vista secundario en los padres -encodeRestorableStateWithCoder:
que hará que se guarde, pero no tengo una forma de usarlo durante una restauración.
El controlador de vista de contenedor " no guarda automáticamente las referencias a ningún controlador de vista secundario contenido. Si está implementando un controlador de vista de contenedor personalizado, debe codificar usted mismo los objetos del controlador de vista secundario si desea que se conserven ".
Hay reglas simples que he encontrado:
1. El controlador de vista integrado (hijo) ya debe haber sido creado y agregado al controlador de vista padre en el proceso de conservación del estado. Por lo tanto, no tiene que hacer nada si usa el guión gráfico, de lo contrario tendrá que crear una instancia de controlador de vista secundaria y agregarlo manualmente:
-(void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Did load");
MyChildViewController *childViewController = [MyChildViewController new];
[self addChildViewController:childViewController];
[childViewController didMoveToParentViewController:self];
self.childVC = childViewController;
}
Puede agregar la vista secundaria en -viewDidLoad
o posterior. Utilice self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view];
self.childVC.view.frame = [self frameForChildController]; [self.view addSubview:self.childVC.view];
para esto.
2.No es necesario que guarde el controlador de vista secundario en el objeto -encodeRestorableStateWithCoder:
los padres, pero debe codificar una referencia a ese objeto utilizando -encodeObject:forKey:
Si tienes referencia puedes hacerlo así:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Encode");
UIViewController *childViewController = self.childVC;
[coder encodeObject:childViewController forKey:@"ChildVC"];
[super encodeRestorableStateWithCoder:coder];
}
vea https://.com/a/13279703/2492707 para obtener una referencia a VC secundaria si usa Storyboard. O puedes escribir algo simple como esto:
-(void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Encode");
UIViewController *childViewController = [self.childViewControllers objectAtIndex:0]; //[self.childViewControllers lastObject];
[coder encodeObject:childViewController forKey:@"ChildVC"];
[super encodeRestorableStateWithCoder:coder];
}
3. El controlador de vista integrado (secundario) ya debe estar creado y agregado al controlador de vista principal en el proceso de restauración de estado . Entonces, si hiciste todo en el primer párrafo, no hay nada más que hacer aquí.
4. "En este caso, sin embargo, no descodificamos el controlador de vista secundario. Podríamos, pero en realidad no lo necesitamos. El objeto MyChildViewController restaurará su propio estado. Solo codificamos esta referencia para obtener el tiempo de ejecución para recorrer la cadena hasta la instancia de MyChildViewController y guardar y restaurar en ella ".
-(void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
NSLog(@"Decode");
[super decodeRestorableStateWithCoder:coder];
}
This libro me ayuda a comprender la preservación del estado con vistas de contenedor. También look un buen ejemplo para este libro.