문제

애니메이션 블록에서 두 개의 조회수를 교환하는 액션을 부르는 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];

그러나 나는 이것이 당신이하려는 일에 효과가 있다고 생각하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top