我在尝试使用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一起使用。代码中的窗口变量是应用程序窗口,它保留在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上呈现控制器。
答案 0 :(得分: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];
}
这显示了选择器,并且在选择器被解除后不会导致Director报告不正确的坐标。
答案 1 :(得分: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;