Итак, вот ситуация (это все в симуляторе):
- создать контроллер представления.он владеет MPMoviePlayerController и добавляет вид игрока как подпредставление к своему собственному.
- установить этот vc как rootViewController окна.
- также в этом виде vc есть кнопка, которая запускает модальныйКонтроллер просмотра (который затемняет фильм) после приостановки проигрывателя фильма.
- нажмите кнопку, запустите модальный VC, а затем отклоните его.
- обратите внимание, что приостановленное изображение проигрывателя фильма исчезло(он просто черный).
- нажмите «play», чтобы возобновить воспроизведение фильма
- crash
Теперь измените цель сборки с iOS 4.3 на iOS 5.0и это работает безупречно.
Что действительно беспокоит меня, так это то, что это не привело к падению до 4.3 месяц назад.На самом деле, у меня в магазине сейчас есть приложение, для которого это прекрасно работает: http://itunes.apple.com/us/app/es-musica-free/id474811522?mt=8
Итак, я попытался свести это к минимальному примеру, который воспроизводит проблему.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor blackColor];
[self.window makeKeyAndVisible];
UIViewController *vc = [[DemoMoviePlayerViewController alloc] init];
[self.window setRootViewController:vc];
[vc release];
vc = nil;
return YES;
}
- DemoMoviePlayerViewController довольно прост.вот файл h:
#import
#import
@interface DemoMoviePlayerViewController : UIViewController
{
MPMoviePlayerController *moviePlayer_;
}
@end
#import "DemoMoviePlayerViewController.h"
@interface DemoMoviePlayerViewController (InternalMethods)
- (void)_buttonPressed:(UIButton*)button;
@end
@implementation DemoMoviePlayerViewController
- (id)init
{
self = [super init];
if (self == nil)
{
return nil;
}
[self setWantsFullScreenLayout:YES];
NSURL *url = [NSURL URLWithString:@"http://once.unicornmedia.com/now/od/auto/0116d5af-bdc1-456d-a3ac-e3cbe25bac98/c762a821-e583-420c-b798-7b8c66736027/6c0e77e0-6dc4-48d5-9197-26e59271e8dd/content.once"];
moviePlayer_ = [[MPMoviePlayerController alloc] initWithContentURL:url];
return self;
}
- (void)dealloc
{
[moviePlayer_ stop];
[moviePlayer_ release];
moviePlayer_ = nil;
[super dealloc];
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
[[self view] setBackgroundColor:[UIColor redColor]]; // debug
[[moviePlayer_ view] setFrame:[[self view] bounds]];
[[moviePlayer_ view] setAutoresizingMask:(UIViewAutoresizingFlexibleWidth
|UIViewAutoresizingFlexibleHeight)];
[moviePlayer_ setControlStyle:MPMovieControlStyleFullscreen];
[[moviePlayer_ view] setBackgroundColor:[UIColor greenColor]]; // debug
[[self view] addSubview:[moviePlayer_ view]];
// add a button to launch share kit
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"launch modal" forState:UIControlStateNormal];
[button addTarget:self
action:@selector(_buttonPressed:)
forControlEvents:UIControlEventTouchUpInside];
[[moviePlayer_ view] addSubview:button];
[button setFrame:CGRectMake(20, 100, 200, 40)];
[moviePlayer_ setShouldAutoplay:YES];
[moviePlayer_ play];
}
#pragma mark - internal methods -
- (void)_dismissModal
{
[self dismissModalViewControllerAnimated:YES];
}
- (void)_buttonPressed:(UIButton*)button
{
if ([moviePlayer_ currentPlaybackRate] == 1.0)
{
[moviePlayer_ setShouldAutoplay:NO];
[moviePlayer_ pause];
}
[self performSelector:@selector(_dismissModal) withObject:nil afterDelay:3.0];
UIViewController *vc = [[UIViewController alloc] init];
[[vc view] setBackgroundColor:[UIColor blueColor]];
[self presentModalViewController:vc animated:YES];
// yeah I know, vc is leaked...
}
@end
Так что, очевидно, каким-то образом MPMoviePlayerController каким-то образом может определить, какие егопредставление становится неясным, несмотря на тот факт, что мой контроллер представления не делает ничего необычного в viewWillDisappear или viewDidDisappear.
Опять же, что меня действительно беспокоит, так это то, что, насколько мне известно, это работало просто отлично под 4.3 примерно месяц назад.