presentModalViewController не работает - PullRequest
3 голосов
/ 20 сентября 2009

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

Ответы [ 2 ]

3 голосов
/ 21 сентября 2009

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

- (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 голосов
/ 15 февраля 2010

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

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

Я не вижу ничего отличного от примера 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;
...