У меня возникла странная проблема с попыткой представить MPMediaPickerController с помощью presentModalViewController. Я работал нормально, но в последнее время (возможно, с 3.1, я точно не помню, как в последний раз он работал) MPMediaPickerController просто отказывается показать себя. Экран просто остается черным, и ничего не происходит, кроме строки состояния наверху, и я вынужден выйти из приложения.presentModalViewController не работает
Вот мой код:
// 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. Переменное окно в коде окно приложения, которое сохраняется в методе инициализации:
// Remember the window that the director is attached in
window = [[[[Director sharedDirector] openGLView] window] retain];
Остальная часть методы, кажется, работает хорошо ... режиссер отрывается от окна и появляется в строке состояния. Но тогда MPMediaPickerController должен появиться на экране, и это не так. Как я уже упоминал, он работал отлично не так давно, поэтому я не понимаю, что здесь происходит.
Спасибо за любую помощь, которую вы можете предоставить.
Edit: Я заметил, что если я закомментировать эти строки:
[[Director sharedDirector] pause];
[[Director sharedDirector] detach];
[window addSubview:musicView];
и заменить их:
[[[Director sharedDirector] openGLView] addSubview: musicView]
... то контроллер выбора показан как это должно быть. Так я добавил представление, когда я впервые реализовал доступ к библиотеке iPod после того, как вышел 3.0, поскольку он немного менее запутан, чем текущий. Однако проблема с этим методом заключается в том, что после того, как контроллер-подборщик отклонен, все сенсорные координаты, которые сообщаются мне на событиях касания, становятся неточными - они примерно на 20 пикселей выше, чем они должны быть (портретная ориентация.) Я не уверен, что это ошибка с Cocos2D или что-то, но в значительной степени исключает представление контроллера непосредственно в openGLView Director.
Одна нота: вам следует подумать о том, чтобы остановить остановку Director, а не паузу, что даст гораздо лучшую производительность. Приостановка может по-прежнему вызывать проблемы, когда у вас есть UITableView в модальном представлении. – Boon