¿Existe una forma general de mejores prácticas de notificación cuando se está descartando el controlador de vista actual (ya sea que aparezca o descarte la marca de Dialog ado)? No puedo usar -viewWillDisappear :, ya que también se llama cuando otro viewController se empuja encima del actual.Método llamado al despedir a un UIViewController?
Respuesta
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
[self addObserver:self forKeyPath:@"parentViewController" options:0 context:NULL];
}
return self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([@"parentViewController" isEqualToString:keyPath] && object == self) {
if (!self.parentViewController)
NSLog(@"Dismissed");
}
}
- (void)dealloc
{
[self removeObserver:self forKeyPath:@"parentViewController"];
[super dealloc];
}
+1. Interesante uso de KVO. – kennytm
inteligente, me gusta! –
Tenga en cuenta que esto puede no funcionar como espera si el controlador se "descarta" como resultado de la destitución de uno de sus padres. En este caso, parentViewController no se desactivará, pero el cuadro de diálogo seguirá sin ser visible. Realmente, "despedido" debería estar mejor definido. –
Por lo que yo sé, no hay forma automática de recibir notificaciones, pero dado que UIViewController tiene una propiedad modalViewController, podría definir un tipo como "didDismiss ..." y llamar a ese método en el controlador anterior de vista modal después de presentar su nuevo controlador de vista modal.
Claro, pero eso no hace nada para los controladores estándar, no modales, y es frágil (requiere que el padre lo llame). Sé que hay formas de evitar esto, solo tengo curiosidad si hay una "mejor manera de hacerlo" aceptada. –
¿Puede aclarar su pregunta?
estoy pensando que usted está pidiendo:
ViewcontrollerONE aparece ViewControllerTWO de forma modal. ViewControllerTWO se descarta. ViewControllerONE quiere saber que That ViewControllerTWO acaba de ignorar a sí mismo, y quiere ejecutar el método XYZ debido a ello.
que no tienen una buena respuesta, pero tengo una manera:
VC1 simplemente se hace referencia en VC2. para que VC2 pueda notificar a VC1 antes de la salida.
No, ViewControllerTWO quiere saber que se descartó la TI. –
La respuesta seleccionada con MVA no funcionó para mí en iOS 8.
I subclases UIViewController de la siguiente manera y luego simplemente llame dismissAnimated:completion:
en el controlador de vista presentado en lugar de dismissViewControllerAnimated:completion:
. Me registro para observar la notificación en otro lugar y desencadenar el manejo según sea necesario.
#define DismissNotifyViewControllerDismissedNotification @"DismissNotifyViewControllerDismissed"
@interface DismissNotifyViewController : UIViewController
- (void)dismissAnimated:(BOOL)flag completion:(void (^)(void))completion;
@end
@implementation DismissNotifyViewController
- (void)dismissAnimated:(BOOL)flag completion:(void (^)(void))completion
{
[self.presentingViewController dismissViewControllerAnimated: flag
completion: ^{
if (completion)
completion();
[NSNotificationCenter.defaultCenter
postNotificationName: DismissNotifyViewControllerDismissedNotification
object: self];
}];
}
@end
Apple cambió la forma de presentación está trabajando en iOS8, que están utilizando presentationControllers, porque no son presentationControllers MVA compilant, tuve que usar porque es containerView
removedFromSuperview
y nilled cuando -[UIPresentationController transitionDidFinish:]
se llama. Solución para iOS8 y superiores:
self.presentationContext.presentViewController(self.viewControllerToPresent, animated: true, completion: { _ in
self.viewControllerToPresent.presentationController?.addObserver(self, forKeyPath: "containerView", options: [], context: &self.observingContext)
})
Estoy añadiendo observador es completionHandler ya que la presentación puede fallar a veces, especialmente cuando se presenta en la presentación ya viewController.
En valor observador i tiene que quitar la observación cuando containerView ya no existe:
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
guard &self.observingContext == context else {
super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context)
return
}
if let presentationController = object as? UIPresentationController where presentationController.containerView == nil {
presentationController.removeObserver(self, forKeyPath: "containerView")
}
}
- 1. sucesivas llamadas al método presentViewController de UIViewController
- 2. -viewDidLoad no llamado en UIViewController subclasificado
- 3. Pasar los parámetros al método llamado por un NSTimer
- 4. Despedir a un evento cada vez que un nuevo método se llama
- 5. iOS5 Storyboard UIViewController ¿qué método init es llamado por el guión gráfico?
- 6. Llamar a un método en un UIViewController desde un UIButton en una subvista
- 7. método virtual puro Llamado
- 8. Método privado llamado error
- 9. ¿Cómo se determina si se ha llamado a un UIViewController como ModalDialog?
- 10. ¿Debería un método de clase modificadora guardarse o ser llamado explícitamente después de llamar al método?
- 11. ¿Es seguro llamar al método ContinueWith en TaskCompletionSource.Task (al que se le ha llamado a .SetResult)?
- 12. Método WCF llamado dos veces
- 13. ¿Existe tal método llamado "getBackgroundColor"?
- 14. ¿Hay un método UIViewController que se llame automáticamente cuando la aplicación se mueve al fondo?
- 15. Convertir UIViewController a UIScrollViewController
- 16. iOS: ¿UIView pertenece a un UIViewController?
- 17. Cómo resolver "método virtual puro llamado"
- 18. Listener androide despedir menú contextual
- 19. método de escritura SessionHandlerInterface no siendo llamado
- 20. Ejecutar un método antes y después de un método llamado en Java
- 21. cómo despedir Hoja de acción
- 22. ¿Cuándo se llama a UIViewController viewDidUnload?
- 23. Objeto Python Mock con un método llamado varias veces
- 24. ¿Hace UIViewController un singleton?
- 25. Añadiendo un TTTableViewController (de tres20) a otro UIViewController
- 26. Anulando un método llamado por el constructor de una clase
- 27. método delegado UITableView llamado dos veces
- 28. ¿Qué es un UIViewController
- 29. Agregar UINavigationController a UIViewController existente
- 30. UITableView dentro de un UIViewController
Nota que el IOS 5 proporciona el método '-isBeingDismissed', que puede ser llamado dentro de' viewWillDisappear: '' o viewDidDisappear: ' . Pero eso no ayuda si tiene que admitir versiones anteriores de iOS. –
@ La respuesta de KristopherJohnson debería marcarse como la respuesta correcta hoy en día, ya que iOS 4 es casi inexistente. –