2009-09-20 3 views
3

presentModalViewController를 사용하여 MPMediaPickerController를 표시하려고 할 때 이상한 문제가 있습니다. 나는 잘 작동했지만, 최근에 (아마 3.1에서 MPMediaPickerController가 그 자체를 보여주기를 거부했을 때 마지막으로 작동하는 것을 정확히 기억하지 못한다.) 화면은 검은 색으로 남아 있고 상태 표시 줄은 맨 위에 있으며 응용 프로그램을 강제 종료합니다. Cocos2D 함께 작동하도록 그걸 얻기 위해presentModalViewController가 작동하지 않습니다.

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

} 

당신이 볼 수 있듯이, 그것은 주로 애플의 예에서 그대로 복사 한 것, 몇 가지 수정을 :

여기 내 코드입니다.

// Remember the window that the director is attached in 
window = [[[[Director sharedDirector] openGLView] window] retain]; 

방법의 나머지는 잘 작동이 나타납니다 ... 감독 창에서 분리 및 상태 표시 줄이 나타납니다 : 코드에서 창 변수는 init 메소드에 유지하는 응용 프로그램 창입니다. 그러나 MPMediaPickerController가 화면에 나타나야하며 그렇지 않습니다. 내가 언급했듯이, 그것은 너무 오래 전부터 잘 작동 했으므로, 여기서 무슨 일이 벌어지고 있는지에 관해서는 손해보고있다.

도움을 주셔서 감사합니다.

편집 :

[[Director sharedDirector] pause]; 
[[Director sharedDirector] detach]; 

[window addSubview:musicView]; 

과로 교체 :

[[[Director sharedDirector] openGLView] addSubview: musicView] 

... 다음 피커 컨트롤러가 그것으로 표시됩니다 나는이 줄을 주석 경우 것으로 나타났습니다 해야한다. 이 방식은 3.0 이후에 처음으로 iPod 라이브러리 액세스를 구현할 때보기를 추가 한 방식이었습니다. 현재의 방식보다 조금 덜 복잡하기 때문에. 그러나이 방법의 문제점은 일단 피커 컨트롤러가 닫히면 터치 이벤트에서 나에게보고 된 모든 터치 좌표가 부정확해진다는 것입니다 (세로 방향으로 약 20 픽셀 더 높음). 이것이 Cocos2D의 버그인지, 아니면 컨트롤러의 openGLView에 컨트롤러를 직접 표시하는 것은 거의 불가능합니다.

답변

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

} 

을 한 번 잘못된 좌표를보고하는 이사가 발생하지 않습니다 피커가 해산됩니다.

+0

하나의 참고 사항 : 일시 중지보다는 Director 's stopAnimation을 호출하면 더 나은 성능을 얻을 수 있습니다. 일시 중지하면 모달보기에서 UITableView있을 때 여전히 문제가 발생할 수 있습니다. – Boon

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; 
+0

음, 지난 밤에 같은 코드가 작동하지 않아. 오늘 아침에 Xcode를 다시 시작하고 앱을 다시 실행하면 효과가 있습니다. 나는 왜 ..... ..... – Yoichi

+0

당신의 코드가 작동하고 있다는 것을 들으면 좋습니다. iPhone SDK와 비슷한 경험을했는데, 분명히 아무 이유없이 일이 시작되거나 멈추었습니다. 매우 실망 스럽습니다. 내가 처음에 문제를 일으켰을지도 모르겠다. 당신이 이미 그것을 보지 않았다면, 내 자신의 질문에 대한 내 대답은 아래에 있습니다 - 당신에게 어떤 도움이 될지 모르겠습니다. 어쨌든 문제가 다시 나타나면 Cocos2D를 사용하지 않는 것 같아서 새로운 문제를 게시 할 수 있습니다. –