presentModalViewController

presentModalViewController

我在尝试使用presentModalViewController呈现MPMediaPickerController时遇到一个奇怪的问题。我的工作正常,但是最近(也许从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一起使用。代码中的window变量是应用程序窗口,该窗口保留在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]


...然后按需显示选取器控制器。这是我在3.0推出后首次实现iPod库访问时添加视图的方式,因为它比当前的方式复杂得多。但是,此方法的问题在于,一旦取消选择器控制器,所有在触摸事件中报告给我的触摸坐标都将变得不准确-它们比实际值高20个像素(纵向)。不知道这是Cocos2D的错误还是什么错误,但是几乎可以排除直接在Director的openGLView上显示控制器的可能性。

最佳答案

好吧,我猜出来了。对于任何可能会遇到这种情况的人,这是一种有效的方法(我会犹豫地说“正确的方法”):

- (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];

}


这将显示选择器,并且一旦解雇该选择器,也不会导致Director报告不正确的坐标。

关于iphone - presentModalViewController不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1450375/

10-10 20:51