presentModalViewController无法正常工作

时间:2009-09-20 05:35:38

标签: iphone cocos2d-iphone mpmediapickercontroller

我在尝试使用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上呈现控制器。

2 个答案:

答案 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;