3

我在尝试使用 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 上显示控制器的可能性。

4

2 回答 2

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 报告不正确的坐标。

于 2009-09-21T00:14:10.563 回答
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;
于 2010-02-15T03:01:19.260 回答