Question

J'ai un objet barButtonItem qui appelle une action qui échange deux vues dans un bloc d'animation. Je désactive le barButtonItem au début de la méthode d'action qu'il appelle, et l'option Je souhaite l'activer à la fin, de sorte que l'utilisateur ne puisse pas inverser la vue avant la fin du retournement.

C’est fait dans un bloc d’animation UIView, donc si je l’active au plus près de la méthode, c’est instantané et cela détruit l’objectif car il est activé avant la fin de l’animation.

Dans la méthode, jette l'expéditeur sur un UIBarButtonItem et le désactive. J'ai donc trouvé [UIView setAnimationDidStopSelector: @selector ()] , mais je dois passer mon barButtonItem dans le sélecteur afin que la méthode enableControl le permette (cela serait beaucoup plus facile si je pouvais créer un nom anonyme. une fonction..).

Alors, comment puis-je faire passer l'argument barButton? Je préférerais ne pas avoir à faire un ivar juste pour ça .. Voici le code:

- (void)barBtnItemSwitchViews_Clicked:(id)sender {
    UIBarButtonItem *barButton = (UIBarButtonItem *)sender;
    barButton.enabled = NO;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    if(!self.yellowVC.view.superview) {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
        [yellowVC viewWillAppear:YES];
        [blueVC viewWillDisappear:YES];
        [blueVC.view removeFromSuperview];
        self.blueVC = nil;
        [innerView addSubview:yellowVC.view];
    } else if(!self.blueVC.view.superview) {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
        [blueVC viewWillAppear:YES];
        [yellowVC viewWillDisappear:YES];
        [yellowVC.view removeFromSuperview];
        self.yellowVC = nil;
        [innerView addSubview:blueVC.view];
    }
    [UIView commitAnimations];
    [UIView setAnimationDidStopSelector:@selector(enableControl:)]; // How do I pass barButton??
}

- (void)enableControl:(UIControl *)control {
    control.enabled = YES;
}

Voici ce que j'ai changé pour, mais la méthode n'est pas appelée .. Qu'est-ce que je fais mal?

- (void)barBtnItemSwitchViews_Clicked:(id)sender {
    UIBarButtonItem *barButton = (UIBarButtonItem *)sender;
    barButton.enabled = NO;
    [UIView beginAnimations:nil context:barButton];
    [UIView setAnimationDuration:0.8];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    if(!self.yellowVC.view.superview) {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
        [yellowVC viewWillAppear:YES];
        [blueVC viewWillDisappear:YES];
        [blueVC.view removeFromSuperview];
        self.blueVC = nil;
        [innerView addSubview:yellowVC.view];
    } else if(!self.blueVC.view.superview) {
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:innerView cache:YES];
        [blueVC viewWillAppear:YES];
        [yellowVC viewWillDisappear:YES];
        [yellowVC.view removeFromSuperview];
        self.yellowVC = nil;
        [innerView addSubview:blueVC.view];
    }
    [UIView setAnimationDidStopSelector:@selector(flipViewAnimationDidStop:finished:context:)];
    [UIView commitAnimations];
}

- (void)flipViewAnimationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    UIBarButtonItem *barButton = (UIBarButtonItem *)context;
    barButton.enabled = NO;
    NSLog(@"Disabled");
}

EDIT: Je l'ai compris. Je devais faire du bouton le contexte, puis setAnimationDelegate: self , puis setAnimationDidEndSelector: @selector (myMethod: termine: context:) , puis dans la méthode Transformez le contexte en uibarbuttonitem et réactivez-le.

Était-ce utile?

La solution

À partir du setAnimationDidStopSelector: de UIView:

  

Le sélecteur doit être de la forme: - (void) animationDidStop: (NSString *) animationID terminée: (NSNumber *) terminé contexte: (void *) contexte .

Le troisième argument, context , est un objet de votre choix, défini dans beginAnimations: context: . Il semble donc que ce qui vous manque, c'est d'utiliser barButton comme argument context , puis de réécrire enableControl avec une signature appropriée. Dans cette méthode, vous prenez le troisième argument, context , et le convertissez de void * en UIBarButtonItem * .

Autres conseils

Je ne pense pas que vous puissiez passer plus d'un argument au sélecteur en utilisant @selector. Toutefois, vous pouvez transformer votre bouton en une variable de classe et l'activer ou le désactiver comme cela dans le sélecteur (au lieu de le transmettre en tant qu'argument). , pour définir un sélecteur avec plusieurs arguments, vous pouvez utiliser NSInvocation, comme ceci

NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];

Mais je ne pense pas que cela fonctionnera pour ce que vous essayez de faire.

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