سؤال

لدي طريقتان. طريقة واحدة يبدأ تشغيل ملف صوتي (.mp3) ، الطريقة الأخرى يقوم بتحديث uitoolbar لإظهار زر (تشغيل أو توقف). يتم استدعاء هاتين الطريقتين بالترتيب التالي:

//Adds some UIBarButtonItems to a UIToolBar
[self togglePlayer];
//Uses AVAudioPlayer
[audioPlayer play];

TogglePlayer يفعل هذا:

-(void)togglePlayer
{

    NSLog(@"Toggling Player");

    NSArray *barButtonItems;
    UIBarButtonItem *barButtonSpaceL;
    UIBarButtonItem *barButtonSpaceR;
    UIBarButtonItem *barButtonItemPlayer;
    UIBarButtonItem *barButtonItemCancel;
    UIBarButtonItem *barButtonItemLyrics;
    UIBarButtonItem *barButtonItemTweet;

    if([myToolbar.items count] > 0){

        NSEnumerator *enumerator = [myToolbar.items objectEnumerator];
        id object;
        while ((object = [enumerator nextObject])) {

            [object release];
            object = nil;
        }   
    }

    if(!downloadInProgress){

    barButtonSpaceL = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    barButtonSpaceR = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];

    if(thePlayerState == PLAYER_PLAYING){
    barButtonItemPlayer = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"pauseIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(pauseButtonPressed:)];
    barButtonItemLyrics = [[UIBarButtonItem alloc] initWithTitle:@"Lyrics" style:UIBarButtonItemStyleBordered target:self action:@selector(switchPageLyrics:)];
    barButtonItemTweet = [[UIBarButtonItem alloc] initWithTitle:@"Tweet This" style:UIBarButtonItemStyleBordered target:self action:@selector(tweetSong:)];

        if(canTweet){
        barButtonItems = [NSArray arrayWithObjects:barButtonItemTweet, barButtonSpaceR, barButtonItemPlayer, barButtonSpaceL, barButtonItemLyrics, nil];
        }else{
        barButtonItems = [NSArray arrayWithObjects:barButtonItemPlayer, barButtonSpaceR, barButtonItemLyrics, nil];         
        }

    }else if(thePlayerState == PLAYER_PAUSED){

    barButtonItemPlayer = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"playIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(playButtonPressed:)];
    barButtonItemLyrics = [[UIBarButtonItem alloc] initWithTitle:@"Lyrics" style:UIBarButtonItemStyleBordered target:self action:@selector(switchPageLyrics:)];
    barButtonItemTweet = [[UIBarButtonItem alloc] initWithTitle:@"Tweet This" style:UIBarButtonItemStyleBordered target:self action:@selector(tweetSong:)];


        if(canTweet){
            barButtonItems = [NSArray arrayWithObjects:barButtonItemTweet, barButtonSpaceR, barButtonItemPlayer, barButtonSpaceL, barButtonItemLyrics, nil];
        }else{
            barButtonItems = [NSArray arrayWithObjects:barButtonItemPlayer, barButtonSpaceR, barButtonItemLyrics, nil];         
        }   

    }else{

    //PLAYER OFF    
    barButtonItems = [NSArray arrayWithObjects:barButtonSpaceL, nil];

    }
        [myToolbar setItems:barButtonItems];    

    }else{


        barButtonSpaceL = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
        barButtonSpaceR = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
        barButtonItemCancel = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"VC1_DownloadCancel", @"") style:UIBarButtonItemStyleBordered target:self action:@selector(downloadCancelled:)];        

        if(thePlayerState == PLAYER_PLAYING){
            barButtonItemPlayer = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"pauseIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(pauseButtonPressed:)];
            barButtonItems = [NSArray arrayWithObjects:barButtonItemPlayer, barButtonSpaceR, barButtonItemCancel, nil]; 

        }else if(thePlayerState == PLAYER_PAUSED){
            barButtonItemPlayer = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"playIcon.png"] style:UIBarButtonItemStylePlain target:self action:@selector(playButtonPressed:)];
            barButtonItems = [NSArray arrayWithObjects:barButtonItemPlayer, barButtonSpaceR, barButtonItemCancel, nil]; 

        }else{

        //PLAYER OFF
            barButtonItems = [NSArray arrayWithObjects:barButtonSpaceL, barButtonItemCancel, barButtonSpaceR, nil]; 
        }

        [myToolbar setItems:barButtonItems];


    }

}

أسمي الأساليب في الطلب أعلاه بحيث يتم عرض زر (توقف مؤقت) في الوقت الذي تبدأ فيه الأغنية. ولكن المشكلة هي أن الأغنية تبدأ في اللعب أولاً ، ويبقى Uitoolbar دون تغيير لفترة طويلة (من 2 إلى 5 ثوانٍ) حتى يتم إضافة الزر وعرضه.

ما أريده هو أن يتم عرض الزر في نفس الوقت الذي تبدأ فيه الأغنية (على سبيل المثال لا تأخير). هل هناك أي طريقة للقيام بذلك؟

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

المحلول

من أجل تحديث واجهة المستخدم الرسومية ، ستحتاج إلى منحها فرصة لتحديث واجهة المستخدم الرسومية بالفعل. نظرًا لأن تشغيل الصوت يحدث في موضوع مختلف ، فسوف يبدأ اللعب على الفور. ومع ذلك ، نظرًا لأنك على الأرجح في حدث من واجهة المستخدم الرسومية (قل مثل حدث اللمس) ولم تعود من هذه الوظيفة ، فإن الكود المسؤول عن تحديث واجهة المستخدم الرسومية لم يتم تشغيله بعد.

نرى http://developer.apple.com/iphone/library/documentation/iphone/conceptual/iphoneosprogrammingguide/applicationenvironment/applicationenvironment.html#//apple_ref/doc/uid/tp400072-sw2 للحصول على معلومات حول إطار الكاكاو

يجب أن يعمل استخدام هذه الوظيفة للاتصال بالطريقة التي تريدها. سيضع هذا الحدث للاتصال بعد معالجة حدثك الحالي.

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay

مثالك:

//Adds some UIBarButtonItems to a UIToolBar
[self togglePlayer];
//Uses AVAudioPlayer
[audioPlayer performSelector:@SEL(play) withObject:nil afterDelay:0];

نصائح أخرى

قد تكون هناك طريقة أخرى هي إعداد النظام لتشغيل ملف الصوت الخاص بك ، باستخدام

[audioPlayer prepareToPlay];

في مكان ما في رمز التهيئة ، على سبيل المثال viewDidLoad. وبهذه الطريقة سيتم تعيين كل شيء بمجرد أن ترغب في تشغيل الصوت ، و play الطريقة لن تسبب تأخير كبير. (ليس في رمز واجهة المستخدم ، وليس في التشغيل الفعلي)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top