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 ライブラリへのアクセスを最初に実装したときに、ビューを追加したのはこの方法でした。現在の方法より少し複雑ではないからです。ただし、この方法の問題は、ピッカー コントローラーが閉じられると、タッチ イベントで報告されるすべてのタッチ座標が不正確になることです。これが Cocos2D のバグなのかどうかはわかりませんが、Director の openGLView でコントローラーを直接表示することはほぼ不可能です。