vida util saber que porcentaje nivel estado duracion desgaste debe condicion como cargar bateria ios uiviewcontroller ios7 uinavigationcontroller state-restoration

util - Restauración de estado de iOS que descarta la pila de navegación



nivel de desgaste bateria iphone (0)

tl; dr El proceso de restauración del estado parece estar sucediendo, pero los controladores de vista de pila (no raíz) no terminan en la aplicación una vez que se completa la restauración.

Estoy tratando de implementar la restauración del estado en una aplicación, que no usa ningún .nibs o storyboard. Es una estructura bastante básica: el rootViewController la ventana es un UINavigationController cuyo propio rootViewController y todos los otros controladores de vista hijo son UITableViewControllers (por ejemplo, Ventana> Nav Ctrl> Vista de tabla Ctrl> Vista de tabla Ctrl> etc.). Ninguno de los controladores de vista se repite (es decir, cada elemento en la pila es una subclase distinta de UITableViewController )

Como no tengo controladores de vista que se creen con guiones gráficos, tengo el inicializador designado para cada clase de controlador de vista que configura el restorationIdentifier y restorationClass .

Cuando la aplicación se está restaurando, veo descodificación para cada controlador de vista que estaba presente cuando la aplicación quedó en segundo plano (por ejemplo, el controlador de navegación, el controlador de lista de podcasts y el controlador de detalles de podcast), pero el resultado final la restauración es siempre el controlador de navegación que aparece con su controlador de vista raíz normal (el controlador de la lista de podcasts).

El problema parece muy similar a esta pregunta , pero definitivamente estoy llamando super en los métodos encode - y decodeRestorableStateWithCoder: en mis controladores de vista (cuando están presentes), por lo que esa solución no me ayuda.

He visto los videos de la WWDC y he pasado por muchos tutoriales, y aunque parece que estoy cumpliendo todos los requisitos, algo no funciona como debería.

Lo único que puedo pensar que está sucediendo es que la restauración está sucediendo, pero mi código de inicialización predeterminado reemplaza la pila de controladores de vista de navegación restaurada con una pila "nueva" que solo incluye la raíz. De acuerdo con el video de la WWDC, la ventana y el controlador de vista raíz deberían configurarse normalmente antes de la restauración del estado, y eso no debería afectar el estado final de la aplicación después de la restauración.

Supongo que el único signo de interrogación para mí es lo que realmente debería estar sucediendo en el método viewControllerWithRestorationIdentifierPath: de mi UINavigationController . ¿ rootViewController establecerse rootViewController como lo estoy haciendo? Y si no, ¿qué más podría pasar? No pude encontrar ningún código de ejemplo en funcionamiento en el que se restaurara un controlador de navegación y no se creó a partir de una punta o guión gráfico. Aparte de eso estoy perplejo.

Código de implementación

FLAppDelegate.m

# pragma mark - UIApplicationDelegate # pragma mark Monitoring App State Changes - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Window and root VC set up in window getter [self.window makeKeyAndVisible]; return YES; } # pragma mark Managing App State Restoration - (BOOL)application:(UIApplication *)application shouldSaveApplicationState:(NSCoder *)coder { return YES; } - (BOOL)application:(UIApplication *)application shouldRestoreApplicationState:(NSCoder *)coder { return YES; } #pragma mark Providing a Window for Storyboarding - (UIWindow *)window { if (!_window) { _window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds]; _window.rootViewController = self.navigationController; } return _window; } - (FLNavigationController *)navigationController { if (!_navigationController) { FLPodcastTableViewController* podcastViewController = [[FLPodcastTableViewController alloc] initWithStyle:UITableViewStylePlain]; _navigationController = [[FLNavigationController alloc] initWithRootViewController:podcastViewController]; } return _navigationController; }

FLNavigationController.m

- (id)initWithRootViewController:(UIViewController *)rootViewController { self = [super initWithRootViewController:rootViewController]; if (self) { self.restorationIdentifier = @"FLNavigationController"; self.restorationClass = self.class; } return self; } #pragma mark - UIViewControllerRestoration + (UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder { FLPodcastTableViewController* podcastViewController = [[FLPodcastTableViewController alloc] initWithStyle:UITableViewStylePlain]; return [[self alloc] initWithRootViewController:podcastViewController]; }

FLPodcastTableViewController.m

- (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { [self.tableView registerClass:FLPodcastTableViewCell.class forCellReuseIdentifier:FLPodcastTableViewCellIdentifier]; self.restorationIdentifier = @"FLPodcastTableViewController"; self.restorationClass = self.class; } return self; } #pragma mark - UIViewControllerRestoration + (UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder { return [[self alloc] initWithStyle:UITableViewStylePlain]; }

FLPodcastEpisodeTableViewController.m

- (id)initWithPodcast:(FLPodcast *)podcast { self = [self initWithStyle:UITableViewStylePlain]; if (self) { self.podcast = podcast; self.restorationIdentifier = @"FLPodcastEpisodeTableViewController"; self.restorationClass = self.class; [self.tableView registerClass:FLPodcastEpisodeTableViewCell.class forCellReuseIdentifier:FLPodcastEpisodeTableViewCellIdentifier]; } return self; } #pragma mark - UIViewControllerRestoration + (UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder { FLPodcastEpisodeTableViewController* viewController = nil; NSString* podcastURI = [coder decodeObjectForKey:kPodcastURLKey]; NSURL* podcastURL = [NSURL URLWithString:podcastURI]; FLPodcast* podcast = [FLPodcast podcastWithURL:podcastURL]; if (podcast) { viewController = [[self alloc] initWithPodcast:podcast]; } return viewController; } - (void)encodeRestorableStateWithCoder:(NSCoder *)coder { [coder encodeObject:self.podcast.feedURL.absoluteString forKey:@kPodcastURLKey]; [super encodeRestorableStateWithCoder:coder]; } - (void)decodeRestorableStateWithCoder:(NSCoder *)coder { [super decodeRestorableStateWithCoder:coder]; }