سؤال

ولدي barButtonItem أن يدعو هذا العمل الذي مقايضة وجهتا نظر في كتلة حيوية. I تعطيل barButtonItem في بداية طريقة عمل أن يدعو، وأريد أن تمكينه في حين ان الانتهاء، بحيث لا يمكن للمستخدم الوجه وجهة النظر مرة أخرى قبل انتهائه التقليب.

ولا يفعل ذلك في كتلة حيوية UIView، لذلك إذا كنت تمكينه في نيد للأسلوب، وسيكون لحظة وتقضي على الهدف لأنه يحصل على تمكين قبل انتهاء الرسوم المتحركة.

في طريقة، ويلقي المرسل إلى 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 وإعادة تمكينه.

هل كانت مفيدة؟

المحلول

ومن مستندات setAnimationDidStopSelector: UIView ل:

<اقتباس فقرة>   

ويجب أن يكون محدد من النموذج: - (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context.

والحجة الثالثة، context، هو كائن من اختيارك، المنصوص عليها في beginAnimations:context:. لذلك يبدو مثل ما كنت في عداد المفقودين هو استخدام barButton كوسيطة context، ومن ثم إعادة كتابة enableControl مع توقيع السليم. في هذه الطريقة، وانت تأخذ الحجة الثالثة، context، وألقها void* إلى 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