Question

Je ne peux pas trouver une explication logique, mais les restes de fait que, dans iOS 5 (Xcode 4.2), si je presentModalView: * animée: OUI, je peux appeler dismissModalViewAnimated: * très bien, mais si je l'appelle presentModalView: * animé: NON, puis en appelant la méthode de rejeter les accidents. (Cela fonctionne même si j'utilise la nouvelle presentViewController: animation: réalisation: + dismissViewControllerAnimated :). Je vais essayer de travailler autour de ce pour l'instant (je ne veux pas que la présentation animée) et signaler un bug à Apple, mais je suis battais ma tête pendant un certain temps. Et toutes les suggestions sont les bienvenus. Pas grand-chose là-bas sur iOS 5, merci de l'aide si vous le pouvez. Exemple de code qui ne se bloque pas dans iOS 4 ou iOS 5:

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

plantera dans iOS 5 avec EXC_BAD_ACCESS sur l'appel rejeter:

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

Une note: J'ai une animation dans le loginController qui se passe sur viewDidLoad. Aller voir si la prise que sur change quelque chose, mais je voulais obtenir ce là-bas depuis que je besoin d'une solution dès que possible.


[Modifier] flux de code complet ... En AppDelegate, application: 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

Retour à 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
}    
Était-ce utile?

La solution

Dans iOS5 la gestion du Lifecyle en quelque sorte changé et je ne peux pas expliquer cette question en détail. Quoi qu'il en soit, le correctif est de reporter ce flux de travail de applicationDidFinishLaunchingWithOptions à applicationDidBecomeActive. Il semble que quelque chose n'est pas initialisé droit à l'appel de applicationDidFinishLaunchingWithOptions.

- (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]
    }
}

Curious ur commentaires:) ....

Autres conseils

Je vais ajouter mes 2 cents: J'avais ImagePickerController et a obtenu son licencie de travail que quand je ne lâchait pas le sélecteur manuellement (IOS 5 SDK)

.

. pour votre cas, je pourrais offrir cette solution de contournement: 1. supprimer la ligne - [Communiqué de loginController]; 2. pour éviter les fuites de mémoire ajouter loginController comme une propriété à votre contrôleur de courant et le relâcher que dans dealloc () du régulateur de courant:

@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

Bonne chance:)

P.S. Je viens d'écrire ce donc il est juste une idée comment tricher. Somebosy peut me corriger ... mais de toute façon, il a travaillé pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top