2009-08-03 1 views
1

У меня есть 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 и снова включить его.

+1

Когда вы редактируете, не удаляйте исходный вопрос ... –

+0

Я поставил свой первоначальный вопрос обратно. – mk12

ответ

3

От setAnimationDidStopSelector: Документах UIView в:

Селектор должен иметь вид: - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context.

Третий аргумент, context, является объектом вашего выбора, установленного в beginAnimations:context:. Так что вам кажется, что вам не хватает barButton в качестве аргумента context, а затем перепишите enableControl с соответствующей подписью. В этом методе вы берете третий аргумент, context, и отливаете его от void* до UIBarButtonItem*.

+0

Спасибо, что вы не упомянули, вам нужно сделать [UIView setAnimationDelegate: сам] первый. – mk12

3

Я не думаю, что вы можете передать более одного аргумента селектору, используя @selector, однако вы можете сделать свою кнопку переменной класса и включить или отключить ее как в селекторе (вместо того, чтобы передавать его как аргумент), чтобы определить селектор с несколькими аргументами вы можете использовать NSInvocation, как так

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

Но я не думаю, что это будет работать для того, что вы пытаетесь сделать.

+0

Прежде всего я не сказал, что мне нужно несколько аргументов, я только хотел. Во-вторых, я сказал, что не хочу использовать ivar (или класс var) – mk12

+1

Что я имел в виду, так это то, что вы не можете пройти aribitrary args в селектор – Daniel

Смежные вопросы