vida util saber nivel estado desgaste condicion como batería bateria apple ahorrar iphone objective-c uikit uiviewcontroller uinavigationbar

util - nivel de desgaste bateria iphone



¿Comprueba si un UIViewController está a punto de obtener Popped de una pila de navegación? (12)

Necesito saber cuándo mi controlador de vista está a punto de salir de una pila de navegación para que pueda realizar una acción.

No puedo usar -viewWillDisappear, porque se llama cuando el controlador de vista se saca de la pantalla por CUALQUIER motivo (como un nuevo controlador de vista que se coloca en la parte superior).

Específicamente necesito saber cuándo el controlador está a punto de explotarse.

Cualquier idea sería increíble, gracias de antemano.


Afortunadamente, cuando se llama al método viewWillDisappear, viewController ya se ha eliminado de la pila, por lo que sabemos que viewController está apareciendo porque ya no está en el auto.navigationController.viewControllers

- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if ((self.navigationController) && (![self.navigationController.viewControllers containsObject:self])) { NSLog(@"I''ve been popped!"); } }


Esto es trabajo para mí.

- (void)viewDidDisappear:(BOOL)animated { if (self.parentViewController == nil) { NSLog(@"viewDidDisappear doesn''t have parent so it''s been popped"); //release stuff here } else { NSLog(@"PersonViewController view just hidden"); } }


Intenté esto:

- (void) viewWillDisappear:(BOOL)animated { // If we are disappearing because we were removed from navigation stack if (self.navigationController == nil) { // YOUR CODE HERE } [super viewWillDisappear:animated]; }

La idea es que al estallar, el control de navegación del controlador de vista se configure como nulo. Entonces, si la vista iba a desaparecer, y ya tiene un navigationController, llegué a la conclusión de que se había reventado. (podría no funcionar en otros escenarios).

No puedo dar fe de que viewWillDisappear se invocará al aparecer, ya que no se menciona en los documentos. Lo intenté cuando la vista estaba en la vista superior y debajo de la vista superior, y funcionó en ambos.

Buena suerte, Oded.


Intenta hacer que esta comprobación en la vista desaparecerá si ([self.navigationController.viewControllers indexOfObject: self] == NSNotFound) {// aparece la aparición de esta vista. }


Intente anular willMoveToParentViewController: (en lugar de viewWillDisappear: en su subclase personalizada de UIViewController .

Se llama justo antes de que se agregue o elimine el controlador de vista desde un controlador de vista de contenedor.

- (void)willMoveToParentViewController:(UIViewController *)parent { [super willMoveToParentViewController:parent]; if (!parent) { // `self` is about to get popped. } }


No creo que haya un mensaje explícito para esto, pero podría subclasificar el UINavigationController y anular - popViewControllerAnimated (aunque no lo he intentado antes).

Alternativamente, si no hay otras referencias al controlador de vista, ¿podría agregar a su - dealloc?


Puedes atraparlo aquí.

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if (viewController == YourAboutToAppearController) { // do something } }

Esto se disparará justo antes de la visualización de la nueva Vista. Nadie se ha movido todavía. Uso todo el tiempo para hacer magia frente al asinine NavigationController. Puede establecer títulos y títulos de botones y hacer lo que sea necesario.


Puedes usar este:

if(self.isMovingToParentViewController) { NSLog(@"Pushed"); } else { NSLog(@"Popped"); }


Reemplace el método viewWillDisappear en el VC presentado, luego verifique el indicador isMovingFromParentViewController dentro de la anulación y haga una lógica específica. En mi caso, estoy ocultando la barra de herramientas de los controles de navegación. Todavía requiere que su VC presentado entienda que fue empujado, por lo que no es perfecto.


Subclase UINavigationController y reemplazar popViewController :

Swift 3

protocol CanPreventPopProtocol { func shouldBePopped() -> Bool } class MyNavigationController: UINavigationController { override func popViewController(animated: Bool) -> UIViewController? { let viewController = self.topViewController if let canPreventPop = viewController as? CanPreventPopProtocol { if !canPreventPop.shouldBePopped() { return nil } } return super.popViewController(animated: animated) } //important to prevent UI thread from freezing // //if popViewController is called by gesture recognizer and prevented by returning nil //UI will freeze after calling super.popViewController //so that, in order to solve the problem we should not return nil from popViewController //we interrupt the call made by gesture recognizer to popViewController through //returning false on gestureRecognizerShouldBegin // //tested on iOS 9.3.2 not others func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { let viewController = self.topViewController if let canPreventPop = viewController as? CanPreventPopProtocol { if !canPreventPop.shouldBePopped() { return false } } return true } }


Tal vez podrías usar el método de protocolo navigationBar: shouldPopItem de UINavigationBarDelegate.


Tengo el mismo problema. Intenté con viewDisDisappear, pero no tengo la función de llamarse :( (no sé por qué, tal vez porque todo mi VC es UITableViewController). La sugerencia de Alex funciona bien pero falla si su controlador de navegación se muestra debajo del Pestaña Más. En este caso, todos los VCs de los controladores de navegación tienen el navigationController como UIMoreNavigationController, no el controlador de navegación que ha subclasificado, por lo que el navegador no le notificará cuando un VC esté a punto de aparecer.
Finalmente, resolví el problema con una categoría de UINavigationController, simplemente reescribí - (UIViewController *) popViewControllerAnimated: (BOOL) animado

- (UIViewController *)popViewControllerAnimated:(BOOL)animated{ NSLog(@"UINavigationController(Magic)"); UIViewController *vc = self.topViewController; if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) { [vc performSelector:@selector(viewControllerWillBePopped)]; } NSArray *vcs = self.viewControllers; UIViewController *vcc = [vcs objectAtIndex:[vcs count] - 2]; [self popToViewController:vcc animated:YES]; return vcc;}

Funciona bien para mí: D