Frage

Ich habe eine barButtonItem, die eine Aktion aufruft, die zwei Ansichten in einem Animationsblock tauscht. Ich deaktivieren Sie die barButtonItem zu Beginn der Aktion-Methode, die es nennt, und die ich mag es ermöglichen, wenn ihre fertigen, so dass der Benutzer nicht die Ansicht wieder drehen kann, bevor es Spiegeln beendet ist.

Es tut dies in einem UIView Animation Block, also wenn ich es am ned des Verfahrens ermöglichen, wird es sofort und zerstört den Zweck, weil es vor der Animation beendet aktiviert wird.

Bei dem Verfahren, warf ich Sender zu einem UIBarButtonItem, und ich deaktivieren, dass. So fand ich [UIView setAnimationDidStopSelector:@selector()], aber ich brauche meine barButtonItem im Selektor übergeben, damit die enableControl Methode ermöglicht es, dass (das wäre viel einfacher, wenn ich eine anonyme Funktion machen könnte ..).

Wie kann ich die barButton als Argument übergeben? Ich hätte lieber keine Ivar nur für diese machen .. Hier ist der Code:

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

Hier ist, was habe ich es zu, aber die Methode wird nicht aufgerufen wird .. Was mache ich falsch?

- (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: Habe ich es aus. Ich musste auf die Schaltfläche den Kontext machen, und dann setAnimationDelegate:self zu tun, und dann setAnimationDidEndSelector:@selector(myMethod:finished:context:), und dann in dem Verfahren werfen Kontext zu uibarbuttonitem und wieder aktivieren.

War es hilfreich?

Lösung

Von UIView der setAnimationDidStopSelector: docs:

  

Der Wähler sollte die folgende Form haben: - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context.

Das dritte Argument, context ist es ein Ziel Ihrer Wahl, stellt in beginAnimations:context:. So wie es scheint, was er verpasst hat barButton als context Argument zu verwenden ist, und dann enableControl mit einer richtigen Unterschrift neu schreiben. Bei diesem Verfahren nehmen Sie das dritte Argument, context und wirf es von void* zu einem UIBarButtonItem*.

Andere Tipps

Ich denke nicht mehr als ein Argument an den Wähler durch @selector Verwendung passieren können, aber Sie Ihre Taste eine Klassenvariable machen könnte und aktivieren oder es so, dass in der Auswahl deaktivieren (statt es als Argument übergeben wird) , einen Selektor mit mehreren Argumenten definieren Sie NSInvocation verwenden können, wie so

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

Aber ich glaube nicht, dass dies für funktioniert, was Sie zu tun versuchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top