Le passage d'arguments dans un sélecteur de l'IPhone
J'ai un barButtonItem qui appelle une action qui échange deux points de vue dans un bloc d'animation. J'ai désactiver le barButtonItem
au début de la méthode d'action, qu'il appelle, et je veux l'activer lorsque c'est terminé, de sorte que l'utilisateur ne peut pas retourner le voir à nouveau avant d'avoir fini de le feuilleter.
Il le fait dans une UIView bloc d'animation, donc Si je l'activer à la ned, de la méthode, il sera immédiate et qui détruit le but car il est activé avant que l'animation se termine.
Dans la méthode, je l'ai jeté de l'expéditeur à un UIBarButtonItem, et je les désactiver. J'ai donc trouvé [UIView setAnimationDidStopSelector:@selector()]
, mais j'ai besoin de passer mon barButtonItem dans le sélecteur de sorte que le enableControl Méthode vous permettra de ça (ce serait beaucoup plus facile si je pouvais en faire une fonction anonyme..).
Alors, comment puis-je passer le barButton comme argument? Je préfère 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é, mais la méthode n'est pas appelé.. 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: j'ai tout compris. J'ai dû faire le bouton, le contexte, et puis ne setAnimationDelegate:self
, puis setAnimationDidEndSelector:@selector(myMethod:finished:context:)
, et ensuite, dans la méthode de fonte contexte de uibarbuttonitem
et de le ré-activer.
- Lorsque vous modifiez, ne retirez pas la question d'origine...
- J'ai mis ma question d'origine de retour.
Vous devez vous connecter pour publier un commentaire.
De UIView de
setAnimationDidStopSelector:
docs:Le troisième argument,
context
, est un objet de votre choix, situé dansbeginAnimations:context:
. Il semble donc que ce que vous êtes en manque, c'est d'utiliserbarButton
comme lecontext
argument, et puis le réécrireenableControl
avec une bonne signature. Dans cette méthode, vous prenez la troisième argument,context
, et il la jeta à partir devoid*
à unUIBarButtonItem*
.Je ne pense pas que vous pouvez passer plus d'un argument pour le sélecteur en utilisant @sélecteur, cependant vous pourriez faire votre bouton d'une variable de classe et de l'activer ou de le désactiver comme ça dans le sélecteur (au lieu d'être passée en argument), afin de définir un sélecteur avec plusieurs arguments, vous pouvez utiliser NSInvocation, comme
Mais je ne pense pas que cela fonctionne pour ce que vous essayez de faire.