У меня странная проблема при попытке представить MPMediaPickerController с использованием presentModalViewController. У меня все работало нормально, но недавно (возможно, начиная с версии 3.1, я точно не помню, когда он работал в последний раз) MPMediaPickerController просто отказывается показывать себя. Экран просто остается черным, с ничего кроме строки состояния в верхней части, и я вынужден выйти из приложения.
Вот мой код:
// Show the music picker, allowing the user to create a playlist
- (void) showMusicPicker;
{
[[Director sharedDirector] pause];
[[Director sharedDirector] detach];
musicView = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
[window addSubview:musicView];
musicController = [[UIViewController alloc] init];
[musicController setView:musicView];
[musicController setModalTransitionStyle: UIModalTransitionStyleCoverVertical];
MPMediaPickerController *picker =
[[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeMusic];
picker.delegate = self;
picker.allowsPickingMultipleItems = YES;
picker.prompt = @"Select songs to play";
// The media item picker uses the default UI style, so it needs a default-style
// status bar to match it visually
[[UIApplication sharedApplication] setStatusBarHidden:NO animated: YES];
[musicController presentModalViewController: picker animated: YES];
[picker release];
}
Как вы можете видеть, это в основном копируется дословно из примеров Apple, с некоторыми изменениями, чтобы заставить его работать с Cocos2D. Переменная окна в коде - это окно приложения, которое сохраняется в методе init:
// Remember the window that the director is attached in
window = [[[[Director sharedDirector] openGLView] window] retain];
Остальная часть метода работает нормально ... директор отсоединяется от окна, и появляется строка состояния. Но тогда MPMediaPickerController должен появиться на экране, а это не так. Как я уже говорил, не так давно все работало нормально, поэтому я не понимаю, что здесь происходит.
Спасибо за любую помощь, которую вы можете предоставить.
Редактировать: Я заметил, что если я закомментирую эти строки:
[[Director sharedDirector] pause];
[[Director sharedDirector] detach];
[window addSubview:musicView];
и замените их на:
[[[Director sharedDirector] openGLView] addSubview: musicView]
... тогда контроллер подборщика отображается в порядке. Это был способ, которым я добавил представление, когда я впервые реализовал доступ к библиотеке iPod после выхода 3.0, поскольку он немного менее запутан, чем нынешний способ. Однако проблема этого метода заключается в том, что после того, как контроллер сборщика отключен, все координаты касания, которые мне сообщают о событиях касания, становятся неточными - они примерно на 20 пикселей выше, чем должны быть (книжная ориентация). не уверен, что это ошибка в Cocos2D или что-то в этом роде, но он в значительной степени исключает возможность представления контроллера непосредственно в openGLView директора.