2009-09-20 1 views
3

У меня возникла странная проблема с попыткой представить 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.

ответ

3

Ну, я понял, думаю. Вот метод работы (я затрудняюсь сказать, «правильный метод») для всех, кто мог бы найти себя в этой ситуации:

- (void) showMusicPicker; 
{ 
    [[Director sharedDirector] pause]; 

    musicController = [[UIViewController alloc] init]; 
    [musicController setView:[[Director sharedDirector] openGLView]]; 
    [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]; 

} 

Это показывает сборщик, и не вызываю директор сообщать о неправомерных координатах один раз сборщик уволен.

+0

Одна нота: вам следует подумать о том, чтобы остановить остановку Director, а не паузу, что даст гораздо лучшую производительность. Приостановка может по-прежнему вызывать проблемы, когда у вас есть UITableView в модальном представлении. – Boon

0

У меня такая же проблема.

Я создал специальный контроллер просмотра модальных данных с собственным протоколом делегирования.

Я не вижу ничего отличного от примера Apple (добавив несколько настроек для реализации делегата и его протокола, в которых отсутствуют фрагменты кода Apple).

Я вижу, что код выполнен, но на экране ничего не отображается, чем на базовом представлении, которое является видом контроллера вызова.

В вашем случае, что, по вашему мнению, мешает появлению модального вида?

Спасибо.

- (void)viewDidLoad 
{ 
    // If this is the first time. 

    DisclaimerViewController *disclaimerViewController = [[DisclaimerViewController alloc] 
                  initWithNibName:@"DisclaimerViewController" bundle:nil]; 
    disclaimerViewController.delegate = self; 
    UINavigationController *myNavigationController = [[UINavigationController alloc] 
                initWithRootViewController:disclaimerViewController]; 
    [self presentModalViewController:myNavigationController animated:YES]; 
    [myNavigationController release]; 
    [disclaimerViewController release]; 

    [super viewDidLoad]; 
} 

Возможно, проблема в том, что модальный вид запрашивается с viewDidLoad? Я переместил код на любую другую, но без изменения ...

Позже в коде (это не должно влиять, почему модальный вид не отображается)

#pragma mark DisclaimerViewDelegate method 
- (void)disclaimerControllerFinished:(DisclaimerViewController *)disclaimerViewController 
{ 
    [disclaimerViewController dismissModalViewControllerAnimated:YES]; 
} 

Ниже затруднительное мне нужно реализовать делегатский протокол. Эта информация отсутствует в коде Apple, но я не думаю, что она имеет какое-либо влияние на то, почему модальный вид не загружен.

@protocol DisclaimerViewDelegate; 

@interface DisclaimerViewController : UIViewController 
{ 
    id<DisclaimerViewDelegate> delegate; 
} 
@property (assign) id<DisclaimerViewDelegate> delegate; 

@end 

@protocol DisclaimerViewDelegate <NSObject> 

- (void)disclaimerControllerFinished:(DisclaimerViewController *)disclaimerViewController; 
+0

Хммм, вчера вечером тот же код не работал. Сегодня утром я снова запустил XCode и перезапустил приложение, и он работает. Я понятия не имею, почему ..... – Yoichi

+0

Хорошо, что ваш код теперь работает, я думаю. У меня был аналогичный опыт с iPhone SDK, где все начинается или прекращается без видимых причин - это очень расстраивает. Боюсь, я не уверен, что могло спровоцировать вашу проблему в первую очередь. Если вы этого еще не видели, мой ответ на мой вопрос ниже - я не уверен, поможет ли это вам. В любом случае, если проблема снова появится, вы можете отправить новый вопрос для своей проблемы, поскольку я думаю, что она немного отличается от моей (вы не используете Cocos2D, не так ли?) –