iPhone의 선택기에서 인수를 전달합니다
-
11-07-2019 - |
문제
애니메이션 블록에서 두 개의 조회수를 교환하는 액션을 부르는 Barbuttonitem이 있습니다. 나는 그것을 비활성화한다 barButtonItem
호출하는 작업 방법의 시작 부분에서, 완료되면 활성화하려면 사용자가 뒤집기 전에 뷰를 다시 뒤집을 수 없도록 활성화하려고합니다.
Uiview 애니메이션 블록 에서이 작업을 수행하므로 메소드의 NED에서 활성화되면 즉각적이며 애니메이션이 완료되기 전에 활성화되기 때문에 목적을 파괴합니다.
이 방법에서, 나는 발신자를 uibarbuttonitem으로 캐스팅하고 그것을 비활성화합니다. 그래서 나는 찾았다 [UIView setAnimationDidStopSelector:@selector()]
, 그러나 enablecontrol 메소드를 사용하면 익명의 기능을 만들 수 있다면 훨씬 쉬울 수 있습니다.
그렇다면 어떻게 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
그리고 다시 활성화.
해결책
uiview 's에서 setAnimationDidStopSelector:
문서 :
선택기는 양식이어야합니다.
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
.
세 번째 논쟁, context
, 당신이 선택한 대상입니다. beginAnimations:context:
. 그래서 당신이 놓친 것은 사용하는 것 같습니다. barButton
로서 context
인수를 한 다음 다시 작성하십시오 enableControl
적절한 서명으로. 그 방법에서, 당신은 세 번째 주장을합니다. context
, 그것을 캐스팅합니다 void*
a UIBarButtonItem*
.
다른 팁
@Selector를 사용하여 하나 이상의 인수를 선택자에게 전달할 수는 없지만 버튼을 클래스 변수로 만들고 (인수로 전달되는 대신) 선택기에서이를 활성화하거나 비활성화하여 정의 할 수 있습니다. 여러 인수가있는 선택기 NSinvocation을 사용할 수 있습니다.
NSInvocation *inv = [[NSInvocation alloc] init];
[inv setSelector:@selector(foo:bar:)];
[inv setArgument:123 atIndex:0];
[inv setArgument:456 atIndex:1];
그러나 나는 이것이 당신이하려는 일에 효과가 있다고 생각하지 않습니다.