Как да спрете автоматичното отхвърляне на MPMoviePlayerViewController на moviePlaybackDidFinish?

MPMoviePlayerViewController, който се представя модално чрез presentMoviePlayerViewControllerAnimated:, автоматично се отхвърля, когато съдържанието му приключи с възпроизвеждането.

Опитах се да деактивирам това, тъй като искам да пусна друго съдържание след това. Въпреки това, дори ако се регистрирам в NSNotificationCenter с [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieFinishedCallback:) name:MPMoviePlayerPlaybackDidFinishNotification object:playerVC.moviePlayer]; и задам друго съдържание, то пак се отхвърля.

Как мога да спра автоматичното отхвърляне на MPMoviePlayerViewController?

АКТУАЛИЗАЦИЯ:

Като пояснение, този въпрос е само за премахване на автоматичното отхвърляне, а не за работа с деактивирания бутон „готово“. Избраният отговор отразява. Това е по замисъл, тъй като предполагаме, че разработчикът добавя свои собствени средства за отхвърляне на MPMoviePlayerViewController. Отговорът на @bickster обаче се занимава и с бутона „готово“.


person SpacyRicochet    schedule 16.11.2012    source източник


Отговори (4)


Благодарение на тази статия в блога разбрах, че MPMoviePlayerViewController автоматично се регистрира към NSNotificationCenter при създаване. Първо трябва да премахнете тази регистрация и тя ще спре да се отхвърля автоматично.

// Initialize the movie player view controller with a video URL string
MPMoviePlayerViewController *playerVC = [[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:aVideoUrl]] autorelease];
// Remove the movie player view controller from the "playback did finish" notification observers
[[NSNotificationCenter defaultCenter] removeObserver:playerVC  name:MPMoviePlayerPlaybackDidFinishNotification object:playerVC.moviePlayer];
person SpacyRicochet    schedule 16.11.2012
comment
Но ако направя това, бутонът Готово вече не работи, което означава, че не мога да затворя видеоплейъра. Тестван в iOS 7. - person Min Soe; 31.03.2014
comment
@MinSoe Въпросът е само за автоматичното отхвърляне, като се предполага, че разработчикът ще инсталира някакъв начин за отхвърляне на самия играч. Отговорът на @bickster по-долу обаче трябва да ви даде повече пробег. Той имаше същия проблем. - person SpacyRicochet; 01.04.2014

Можете да използвате този код, за да спрете автоматичното отхвърляне на viewcontroller и да заснемете събитието, когато потребителят щракне върху бутона „Готово“, за да можете сами да отхвърлите viewcontroller.

Стъпка 1. - разпределяне на MPMoviePlayerViewController

videoPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[[NSURL alloc ]initWithString:[aURL];

Стъпка 2. - Премахнете стандартния наблюдател MPMoviePlayerPlaybackDidFinishNotification и добавете свой собствен

[[NSNotificationCenter defaultCenter] removeObserver:videoPlayer
name:MPMoviePlayerPlaybackDidFinishNotification object:videoPlayer.moviePlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(videoFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:videoPlayer.moviePlayer];

Стъпка 3. - Представете viewcontroler

[self presentMoviePlayerViewControllerAnimated:videoPlayer];

Стъпка 4. - Добавете videoFinish: метод

-(void)videoFinished:(NSNotification*)aNotification{
    int value = [[aNotification.userInfo valueForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey] intValue];
    if (value == MPMovieFinishReasonUserExited) {
        [self dismissMoviePlayerViewControllerAnimated];
    }
}
person bickster    schedule 25.10.2013
comment
Наистина любопитно. Защо да добавяте друг, почти дублиран отговор на въпрос, на който е отговорено преди почти година? - person SpacyRicochet; 28.11.2013
comment
Не е почти дубликат. Отговорът не ми помогна. Отговорът, който дадох, работи и е по-пълен. Нещо трябва да се е променило след отговора на този въпрос. Надявам се, че отговорът ми ще спести на хората часовете, които прекарах да разбера как работи днес. Надявам се отговорът ми да задоволи любопитството ви. - person bickster; 01.12.2013
comment
Просто истинският въпрос е само за премахване на действителното уволнение, на което се отговаря в първия ред от кода на вашата стъпка 2. Наистина не разбирам какво прави останалото, освен добавянето на същата функционалност, която се опитвате да премахнете . - person SpacyRicochet; 03.12.2013
comment
Това е по-добър отговор, защото ако не направите това (поне в iOS 7), тогава няма начин потребителят изобщо да отхвърли контролера. С този подход получавате това, което искате, тъй като контролерът се появява и след това остава наоколо, докато потребителят изрично не му каже да си отиде. Ако това не е, което искате, добре, тогава не го правете по този начин :) - person Tom S.; 19.02.2014
comment
Това е правилният отговор - накарайте видеоплейъра да остане на екрана ДОКАТО потребителят изрично не натисне Готово. Единственото нещо, което бих искал, @bickster, е да коригираш последния ред във втория фрагмент - липсва ти обект:nil]; Аз мисля :) - person JakeP; 31.07.2014
comment
Това не работи за мен. Какво става в края на втория кодов фрагмент след MPMoviePlayerPlaybackDidFinishNotification? - person Siriss; 19.08.2014
comment
това е идеалният отговор. Работи за мен :) - person Smit Shah; 21.05.2016

Можете да опитате нещо подобно.

когато mpmovieplayercontroller завърши възпроизвеждането на видеоклип и получите известието във вашия метод movieFinishedCallback: implemect

       [playerVC.movieplayer setContentURL:// set the url of the file you want to play here];

       [playerVC.moviePlayer play];

Надявам се това да помогне

person Jasmeet Singh    schedule 16.11.2012

Тъй като бутонът „Готово“ вече не работи, ако премахна MPMoviePlayerPlaybackDidFinishNotification от NSNotificationCenter, променям режима на повторение на MPMovieRepeatModeOne. След това всичко работи добре, освен че видеото се повтаря.

MPMoviePlayerViewController *playerVC = [[[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL URLWithString:aVideoUrl]] autorelease];
[playerVC.moviePlayer setRepeatMode:MPMovieRepeatModeOne];
person Min Soe    schedule 31.03.2014