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 で動作するようにいくつかの変更が加えられています。コード内のウィンドウ変数はアプリケーション ウィンドウであり、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 でコントローラーを直接表示することはほぼ不可能です。

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];

}

これはピッカーを示しており、ピッカーが閉じられた後、ディレクターが不適切な座標を報告することはありません。

于 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 に答える