2013-04-02 2 views
0

나는 C++로 만든 게임을 만들고 있는데 어느 시점에서 카메라를 사용하고 싶어합니다. 모달 뷰 컨트롤러를 제공 오브젝티브 C 클래스와이 그 인터페이스를 수행합니다콜백에서 변경 될 때 변수가 유지되지 않음

UIImagePickerController* cameraUI = [[UIImagePickerController alloc] init]; 
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; 
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage, nil]; 
cameraUI.allowsEditing = YES; 
cameraUI.delegate = self; 

[[[[UIApplication sharedApplication] keyWindow] rootViewController] presentModalViewController:cameraUI animated:YES]; 

이 클래스는 게임이 모달 뷰 컨트롤러의 진행 상황을 볼 수 있도록하는 상태 변수를 노출합니다. UIImageControllerDelegate 기능에 의해

State = CAMERA_ACTIVITY_WORKING; 

을 그리고 업데이트 : 은 그것은 initalized됩니다

- (void)imagePickerControllerDidCancel: (UIImagePickerController*) picker 
{ 
    State = CAMERA_ACTIVITY_CANCELED; 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

- (void)imagePickerController: (UIImagePickerController*) picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    State = CAMERA_ACTIVITY_IMAGECAPTURED; 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

모달 뷰 컨트롤러가 열리고은해야하고 대표가 확실히 전화를받을로 닫습니다. 그러나 게임이 State 변수를 폴링하면 업데이트되지 않아 CAMERA_ACTIVITY_WORKING을 반환합니다. 변수를 휘발성으로 만들려고 시도했지만 아무 효과가 없습니다.

아무도 도와 줄 수 있습니까?

편집 : 전체 클래스 소스 코드

@interface Camera : UIViewController<UIImagePickerControllerDelegate, UINavigationControllerDelegate> 
{ 
    volatile State State; 
    UIImage* CapturedImage; 
} 

- (void)imagePickerControllerDidCancel: (UIImagePickerController*) picker; 

- (void)imagePickerController: (UIImagePickerController*) picker didFinishPickingMediaWithInfo:(NSDictionary *)info; 

- (bool) IsAvailable; 

- (bool) Show; 

- (State) GetState; 

@end 

하는 .m

@implementation Camera 

- (id)init 
{ 
    self = [super init]; 
    if(!self) return self; 

    State = CAMERA_ACTIVITY_WORKING; 
    CapturedImage = NULL; 

    return self; 
} 

- (void)imagePickerControllerDidCancel: (UIImagePickerController*) picker 
{ 
    DEBUG_LOG("imagePickerControllerDidCancel"); 
    State = Poppet::ICameraActivity::CAMERA_ACTIVITY_CANCELED; 
    DEBUG_LOG("State: " + STRING_CAST(State)); 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

- (void)imagePickerController: (UIImagePickerController*) picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 

    State = CAMERA_ACTIVITY_IMAGECAPTURED; 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

- (bool) IsAvailable 
{ 
    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] == YES; 
} 


- (bool) Show 
{ 
    if(![self IsAvailable]) return false; 

    State = CAMERA_ACTIVITY_WORKING; 

    UIImagePickerController* cameraUI = [[UIImagePickerController alloc] init]; 
    cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; //Get Image From Camera 
    cameraUI.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage, nil]; 
    cameraUI.allowsEditing = YES; 
    cameraUI.delegate = self; 

    [[[[UIApplication sharedApplication] keyWindow] rootViewController] presentModalViewController:cameraUI animated:YES]; 
    return true; 
} 

- (State) GetState 
{ return State; } 

@end 
+0

은 강력하게, 그리고 당신이 viewDidAppear 또는 viewWillAppear 방법을 재설정하지 않습니다 확인? imagePicker이 기각로하기 때문에, 이러한 방법은 다른 것을 원하셨습니까, 자동으로 –

+0

내가 주 강력하게 만들 수 없다, 그것의하지에 대한 참조를 호출 할 것인가? 나는 viewDidAppear를 구현하고 있지 않다 또는 – XZodia

답변

0

그것은 당신이 사용자 정의 Camera 클래스를 사용하지 않는 것 같습니다 .H.

당신은

UIImagePickerController* cameraUI = [[UIImagePickerController alloc] init]; 

가 대리자를 설정 클래스와 다른 항목을 만들고 사용자에게 표시됩니다. 그러나 이것은 Camera 클래스의 인스턴스가 아니며 UIImagePickerController의 인스턴스입니다. 나는 당신이 당신에게 당신의 정의 UIViewController의 구현을 줄 것이다
Camera* cameraUI = [[Camera alloc] init]; 

는 그러나 또 다른 문제가하고 싶은 생각합니다. Camera 클래스는 UIImagePickerController의 하위 클래스가 아니며 UIViewController의 하위 클래스이므로 UIImagePickerController이 아닙니다. 나는 그것이 당신이 그것을 의도했다라고 생각한다

@interface Camera : UIImagePickerController<UIImagePickerControllerDelegate, UINavigationControllerDelegate> 

참고로, 명명 규칙은 단지 대문자로 시작해야한다고 말한다. 메서드 이름과 변수는 소문자로 시작해야합니다. 코멘트에서

편집 :

귀하의 Show 방법은 어디에서 호출 할 것처럼하지, 그래서 그것이 사용되는 방법을 잘 모르겠어요 않습니다. 그 이상으로, 방법을 보면서, 나는 그것이 어떻게 사용될 것인지 모른다. -은 처음에는 Camera 인스턴스에서만 호출 할 수있는 인스턴스 메서드이지만, Camera 인스턴스를 만들고 표시하는 데 사용되므로 메서드에서 새로 만든 인스턴스를 만들고 표시하기 위해 메서드의 인스턴스와 인스턴스가 필요합니다. 개체의 아마 의도 한 것이 아닙니다. +을 사용하여 클래스 메소드로 만들고 [Camera Show]으로 호출 할 수 있지만 인스턴스 변수가 없기 때문에 인스턴스 변수에 액세스 할 수 없습니다.Camera이 (Show 외부) 생성되고 그냥 일반적인 UIImagePickerController이 아닌 사용자 정의 클래스를 표시하는 것 같습니다 있도록 활성 뷰 컨트롤러가 될 수있는 곳

현재, 난 아무 표시되지 않습니다.

+0

viewWillAppear 내가 UIImagePickerController를하고 무효 쇼에서 상속하는 클래스 카메라를 개정 한 지금 대신 코드에 대한 개선하지만 불행히도, 문제가 남아 표준 UIImagePickerController를 할당의 자아를 사용합니다. – XZodia

+0

문제점을 발견했습니다. 실수로 두 번 내 카메라 클래스를 할당하고 잘못된 인스턴스를 확인했다. (답변과 유사하지만 다른 코드에서 무슨 일이 일어나고) – XZodia

관련 문제