2009-08-03 12 views
1

私は、アニメーションブロック内の2つのビューを交換するアクションを呼び出すbarButtonItemを持っています。私はそれが呼び出すアクションメソッドの最初にbarButtonItemを無効にし、終了時に有効にして、反転させる前にユーザーがビューを再び反転させることができないようにします。IPhoneのセレクタに引数を渡す

これはUIViewアニメーションブロックで行います。メソッドのnedで有効にすると、瞬時になり、アニメーションが終了する前に有効になるため、目的を破棄します。

このメソッドでは、送信者をUIBarButtonItemにキャストし、それを無効にします。だから私は[UIView setAnimationDidStopSelector:@selector()]を見つけましたが、enableControlメソッドがこれを有効にするようにセレクタにbarButtonItemを渡す必要があります(これは非常に簡単ですが、匿名関数を作ることができます..)。

barButtonを引数として渡すにはどうすればよいですか?私はむしろ、このためだけにIVARをしなければならないだろう...ここでは、コードです:

- (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"); 
} 

編集:私はそれを考え出しました。ボタンをコンテキストにしてからsetAnimationDelegate:selfを実行し、次にsetAnimationDidEndSelector:@selector(myMethod:finished:context:)を実行し、メソッドをuibarbuttonitemにキャストして再度有効にしてください。

+1

オリジナルの質問を削除しないでください。 –

+0

元の質問を元に戻します。 – mk12

答えて

3

のUIViewのsetAnimationDidStopSelector:ドキュメントから:

セレクタは、次の形式になります- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

第3引数のcontextは、beginAnimations:context:に設定されたオブジェクトです。だからあなたが欠けているようなものは、context引数としてbarButtonを使用してから、enableControlを正しい署名で書き直すことです。その方法では、3番目の引数contextをとり、void*からUIBarButtonItem*にキャストします。

+0

あなたが言及しなかったことだけありがとう[UIView setAnimationDelegate:自己]まず。 – mk12

3

@selectorを使用して複数の引数をセレクタに渡すことはできませんが、ボタンをクラス変数にしてセレクタのように有効または無効にすることができます(引数として渡される代わりに)、あなたがそう

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

のように、NSInvocationを使用することができ、複数の引数を持つセレクタを定義しかし、私は、これはあなたがやろうとしているもののために働くだろうと思ういけないします。

+0

まず第一に、私は複数の議論が必要だとは言わなかった。第二に、私はivar(またはクラスvar)を使用する必要はないと言った – mk12

+1

私はあなたがセレクタに任意のargsを渡すことができないことを意味した – Daniel