我在尝试使用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/