Pregunta

No puedo encontrar ninguna explicación lógica, pero el hecho es que, en iOS 5 (Xcode 4.2), si presento ModalView:* Animado: Sí, puedo llamar a SeckModalViewAnimated:* Bien, pero si llamo PresentModalView:* Animado: No , luego llamando a los bloqueos del método de despedida. (Esto funciona igual si uso el nuevo presente ViewController: Animated: Finalation: + SeckViewControllerAnimated :). Voy a tratar de trabajar con esto por ahora (no quiero que la presentación se anime) e informar un error a Apple, pero he estado golpeando mi cabeza en esto por un tiempo. Todas y cada una de las sugerencias son bienvenidas. No hay mucho en iOS 5, así que por favor ayuda si puedes. Código de muestra que no se bloquea en iOS 4 o iOS 5:

LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:YES];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES];

Esto se bloqueará en iOS 5 con exc_bad_access en la llamada de despedida:

LoginController *loginController = [[LoginController alloc]    initWithNibName:@"LoginControllerGG" bundle:nil];
[self presentModalViewController:loginController animated:NO];
[loginController release];
...
[self dismissModalViewControllerAnimated:YES]; //crashes with EXC_BAD _ACCESS

Una nota: tengo una animación dentro del Logincontroller que ocurre en ViewDidload. Voy a ver si sacar eso cambia algo, pero quería sacar esto, ya que necesito una solución lo antes posible.


Editar] Flujo de código completo ... en AppDelegate, aplicación: DidFinishLaUnchingWithOptions:

if (!loggedIn)  [myViewController showLoginPanel];

En myViewController:

- (void)showLoginPanel {    
    LoginController *loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
        [self presentViewController:loginController animated:NO completion:nil];
    } else {
        [self presentModalViewController:loginController animated:NO]; //iOS 4 works fine with or without animation   
    } 
    [loginController release];  
}

En Logincontroller:

- (IBAction)closeLoginWindow {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"CloseLoginWindow" object:nil];
}   //doing it this way because calling on the self.parentViewController doesn't work

De vuelta en myViewController:

- (void) viewDidLoad
    ...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeLoginWindow) name:@"CloseLoginWindow" object:nil];
    ...

- (void)closeLoginWindow {
    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]) {
        [self dismissViewControllerAnimated:YES completion:nil];    //iOS 5 crashes only if presentation was not animated
    } else [self dismissModalViewControllerAnimated:YES];    //deleting the previous condition, iOS 5 still crashes if presentation was not animated
}    
¿Fue útil?

Solución

En iOS5, la gestión del estilo de vida cambió de alguna manera y no puedo explicar ese problema en detalle. De todos modos, la solución es posponer ese flujo de trabajo de ApplicationDidFinishLaunchingWithOitions a ApplicationDidBecomEActive. Parece que algo no se inicializa perfectamente en la llamada de ApplicationDidFinishLaunchingWithOitions.

- (void)applicationDidFinishLaunchingWithOptions:... {    
    // in order to do this only at launching, but not on every activation 
    // Declaration as property for example
    applicationDidLaunch = YES;
}

- (void) applicationDidBecomeActive:(UIApplication *)application {
    if (applicationDidLaunch) {
        applicationDidLaunch = NO;
        [Start your login Workflow with modal view presenting here]
    }
}

Curioso a sus comentarios :) ....

Otros consejos

Agregaré mis 2 centavos: tuve ImagePickerController y obtuve su despedida de funcionar solo cuando no lanzé el selector manualmente (iOS 5 SDK).

Asi que. Para su caso, podría ofrecer dicha solución: 1. Eliminar la línea - [Logincontroller versión]; 2. Para evitar fugas de memoria, agregue logincontroller como una propiedad para su controlador actual y suelte solo en DealLoc () del controlador actual:

@interface myViewController : UIViewController 

@property (nonatomic, retain) LoginController *loginController;

@end

...

@implementation myViewController

- (void)showLoginPanel {    
    self.loginController = [[LoginController alloc] initWithNibName:@"LoginControllerGG" bundle:nil];
     // ... something goes here  
}

-(IBAction)loginClose() 
{
    // this should close all windows as far as you call it from current (main) controller
    [self dismissModalViewControllerAnimated:YES]; 
    // ... then anything you want EXCEPT [loginController release];
}

-(void)dealloc() 
{
    [loginController release];
}

@end

Buena suerte :)

PD: Acabo de escribir esto, así que es solo una idea de cómo engañarlo. Somebosy puede corregirme ... aunque de todos modos funcionó para mí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top