У меня есть barButtonItem, который вызывает действие, которое обменивает два представления в блоке анимации. Я отключу barButtonItem
в начале метода действия, который он вызывает, и я хочу включить его, когда он закончен, чтобы пользователь не мог перевернуть вид еще до того, как он закончит перелистывание.Передача аргументов в селекторе в IPhone
Он делает это в блоке анимации UIView, поэтому, если я включу его на уровне метода, он будет мгновенным и уничтожит цель, потому что она активируется до завершения анимации.
В методе я отправил отправителя в UIBarButtonItem, и я отключил его. Поэтому я нашел [UIView setAnimationDidStopSelector:@selector()]
, но мне нужно передать свой barButtonItem в селектор, поэтому метод enableControl позволит это (это было бы намного проще, если бы я мог сделать анонимную функцию ..).
Так как я могу передать barButton в качестве аргумента? Я предпочел бы не сделать Ивар только для этого .. Вот код:
- (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;
}
Вот что я изменил его, но этот метод не вызывается .. Что я делаю неправильно?
- (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: я понял это. Я должен был сделать кнопку контекстом, а затем сделать setAnimationDelegate:self
, а затем setAnimationDidEndSelector:@selector(myMethod:finished:context:)
, а затем в контексте метода использовать uibarbuttonitem
и снова включить его.
Когда вы редактируете, не удаляйте исходный вопрос ... –
Я поставил свой первоначальный вопрос обратно. – mk12