2009-08-03 24 views
1

我有一個barButtonItem調用一個動作,它交換動畫塊中的兩個視圖。我在它調用的動作方法的開頭禁用了barButtonItem,並且我想在完成時啓用它,以便用戶在翻轉完成之前不能再次翻轉視圖。傳遞參數在iPhone中的選擇器

它在UIView動畫塊中這樣做,所以如果我在方法的ned中啓用它,它將是即時的並且破壞目的,因爲它在動畫完成之前被啓用。

在該方法中,我將發件人轉換爲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"); 
} 

編輯:我想通了。我必須將按鈕作爲上下文,然後執行setAnimationDelegate:self,然後setAnimationDidEndSelector:@selector(myMethod:finished:context:),然後在方法上下文中將其轉換爲uibarbuttonitem並重新啓用它。

+1

當你編輯,不要刪除原來的問題... – 2009-08-03 21:31:53

+0

我把我原來的問題回來。 – mk12 2009-08-18 22:44:15

回答

3

從UIView的的setAnimationDidStopSelector:文檔:

的選擇應該是這樣的形式:- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context

第三個參數,context,是你的選擇,在beginAnimations:context:設定的目標。所以看起來你缺少的是使用barButton作爲context參數,然後用正確的簽名重寫enableControl。在該方法中,您採用第三個參數context,並將其從void*轉換爲UIBarButtonItem*

3

我不認爲你可以使用@selector傳遞多個參數的選擇,但是你可以讓你的按鈕類變量,並啓用或選擇這樣的禁用它(而不是將其作爲參數傳遞),定義具有多個參數的選擇,你可以使用NSInvocation的,像這樣

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

但我不認爲這會爲你正在嘗試做的工作。

+0

首先我沒有說我需要多個參數,我只想要一個參數。其次,我說我不想不得不使用伊娃(或類VAR) – mk12 2009-08-03 19:46:12