ios - bootstrap - autocomplete in modal dialog
¿Cómo descartar una pila de controladores de vista modal con animación sin destellar en la pantalla ninguno de los VCs presentados entre la parte superior e inferior? (1)
No es un error. Cambia la animación de eliminación solo para self.presentedViewController
("violeta") cuando dismissViewControllerAnimated
pero no para todos los VC anidados. Cuando "violeta" recibe un mensaje sobre eliminación con animación, borra todos los visualizados ViewController sin animación. Y luego ves la animación del "violeta" sin controladores anidados. Para comprobar esto, simplemente puede crear su propia clase de VC y verificar el método de de-alloc.
ACTUALIZADO: Corregido a través del esquema de método de "captura de pantalla" a continuación. Esto funciona, pero ¿hay una manera más elegante?
¿Cómo voy a descartar una pila de controladores de vista modal con animación sin mostrar en la pantalla ninguno de los VC presentados entre la parte superior e inferior? Intentar hacer esto con animación no está funcionando. Vea el código a continuación y los comentarios en línea que describen mi problema. ¡Puede copiar / pegar este código en un nuevo proyecto en Xcode para verlo usted mismo si lo desea!
//
// ViewController.m
// MultipleModals
//
#import "ViewController.h"
#import "MyViewController.h"
#import "MyHelper.h"
@interface ViewController ()
@end
@implementation ViewController
static BOOL doAgain = YES; // So when red appears again, we don''t endlessly cycle (for testing)
- (void)viewDidAppear:(BOOL)animated
{
// Invoke super
[super viewDidAppear:animated];
// Prevent loop when we dismiss all the way back to red (for testing)
if (doAgain)
{
// Okay here''s where the demo code starts...
// PRESENTING a full stack of modals WITHOUT animation WORKS and results in the user
// only seeing orange when this red view controller "appears" (red never actually appears, which is great)...
MyViewController *purple = [[MyViewController alloc] init];
purple.title = @"purple"; // For use in MyViewController''s dealloc method
purple.view.backgroundColor = [UIColor purpleColor];
[self presentViewController:purple animated:NO completion:^{ // Purple successfully gets presented and the user never sees purple, great.
NSLog(@"Purple?");
MyViewController *green = [[MyViewController alloc] init];
green.view.backgroundColor = [UIColor greenColor];
green.title = @"green"; // For use in MyViewController''s dealloc method
[purple presentViewController:green animated:NO completion:^{ // Green successfully gets presented and the user never sees green, great.
NSLog(@"Green?");
MyViewController *orange = [[MyViewController alloc] init];
orange.view.backgroundColor = [UIColor orangeColor];
orange.title = @"orange"; // For use in MyViewController''s dealloc method
[green presentViewController:orange animated:NO completion:^{ // Orange successfully gets presented and the user DOES see orange, great.
NSLog(@"Orange?");
// FIXED MY ISSUE STARTING HERE
// Comment out the following code to toggle between
// the "flashing purple issue" and "the desired outcome" (single
// animation from top to bottom regardless of how many VCs are
// on the stack, i.e. no flashing).
// Get orange screenshot
UIImage *orangeScreenShotImage = [MyHelper screenshot];
UIImageView *orangeScreenShotImageView = [[UIImageView alloc] initWithImage:orangeScreenShotImage];
// Give purple an orange screenshot since orange will just "flash away" and then purple will animate
// away but we''ll disguise purple to appear as if it''s orange by layering a screenshot of orange on purple. Boom.
[purple.view addSubview:orangeScreenShotImageView];
// FIXED MY ISSUE ENDING HERE
// FOR TESTING PURPOSES... dismiss after 5 seconds...
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
doAgain = NO; // Prevent viewDidAppear loop (related to my testing code)...
// THIS IS MY BUG HERE. WHEN I WANT TO **ANIMATE** THE DISMISSAL OF ORANGE ALL THE WAY BACK TO RED, HOWEVER, I SEE PURPLE FOR A FLASH BEFORE RED!! WHY?
// If I do not animate, things work as expected and I go from orange directly back to red in one flash. Why can''t I go from orange back red WITH ANIMATION without seeing a flash of purple?
BOOL animateDismissalOfOrangeBackToRed = YES; // YES causes me to see a flash of purple before red, why?
[self dismissViewControllerAnimated:animateDismissalOfOrangeBackToRed completion:^{
NSLog(@"Back to red...");
}];
});
}];
}];
}];
}
}
- (void)viewDidLoad
{
// Invoke super
[super viewDidLoad];
// Set self''s background color
self.view.backgroundColor = [UIColor redColor]; // Color of self, root VC
}
@end
MyViewController.m (nos permite tener un método dealloc personalizado para la depuración)
//
// MyViewController.m
// MultipleModals
//
#import "MyViewController.h"
@interface MyViewController ()
@end
@implementation MyViewController
- (void)dealloc
{
NSLog(@"Inside dealloc self.title = %@", self.title);
}
@end
ACTUALIZADO: Se agregó un nuevo archivo MyViewController.m para la depuración dealloc.
Curiosamente, el registro sale con un aspecto como este:
2014-11-20 10:06:28.847 MultipleModals[5470:946774] Purple?
2014-11-20 10:06:28.851 MultipleModals[5470:946774] Green?
2014-11-20 10:06:28.853 MultipleModals[5470:946774] Orange?
2014-11-20 10:07:04.055 MultipleModals[5470:946774] Inside dealloc self.title = orange
2014-11-20 10:07:04.056 MultipleModals[5470:946774] Inside dealloc self.title = green
2014-11-20 10:07:04.565 MultipleModals[5470:946774] Back to red...
2014-11-20 10:07:04.566 MultipleModals[5470:946774] Inside dealloc self.title = purple
ACTUALIZADO: He agregado un proyecto de ejemplo para que pueda observar este primer identificador muy fácilmente si lo desea: https://github.com/johnerck/MultipleModals
Además, he leído Presentaciones de controladores de vista desde otros controladores de vista muchas veces. Incluso dicen: "Por ejemplo, si el usuario cancela la operación actual, puede eliminar todos los objetos de la cadena descartando el primer controlador de vista presentado. Descartar un controlador de vista descarta no solo ese controlador de vista sino también cualquier controlador de vista que presente. " Estoy viendo este comportamiento, pero la animación muestra 3 vistas en total, no las 2 esperadas.