0

私はある時点でカメラを利用して開きたいC++で作られたゲームを作っています。これを行うために、モーダル ビュー コントローラーを提示する Objective 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];

このクラスは State 変数を公開して、ゲームがモーダル ビュー コントローラーの進行状況を監視できるようにします。初期化されます:

State = CAMERA_ACTIVITY_WORKING;

UIImageControllerDelegate 関数によって更新されます。

- (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 が返されます。変数を揮発性にしようとしましたが、これは効果がありませんでした。

誰でも助けることができますか?

編集:フルクラスのソースコード

.h

@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
4

1 に答える 1

0

カスタムCameraクラスを使用していないようです。

クラスを作成します

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

デリゲートとその他の項目を設定し、ユーザーに表示します。しかし、これはCameraクラスのインスタンスではなく、のインスタンスですUIImagePickerController。私はあなたがやりたいと信じています

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

これにより、カスタムの実装が得られますUIViewControllerが、別の問題があります。あなたのCameraクラスは のサブクラスではありません。 のサブクラスUIImagePickerControllerであるUIViewControllerため、 にはなりませんUIImagePickerController。私はあなたがそれを意図したと思います

@interface Camera : UIImagePickerController<UIImagePickerControllerDelegate, UINavigationControllerDelegate>

余談ですが、命名規則では、クラス名のみが大文字で始まる必要があるとされています。メソッド名と変数は小文字で始める必要があります。

コメントから編集:

あなたのShowメソッドはどこからも呼び出されていないように見えるので、どのように使用されるかわかりません。それよりも、メソッドを見ると、それがどのように使用されるかわかりません。先頭の-は、 のインスタンスでのみ呼び出すことができるインスタンス メソッドであることを意味しますが、 のインスタンスCameraを作成して表示するために使用されるCameraため、メソッドはオブジェクトの新しく作成されたインスタンスを作成して表示するためにオブジェクトのインスタンスを必要とします。 . おそらく意図したものではありません。a を使用し+てクラス メソッドにして で呼び出すこと[Camera Show]もできますが、インスタンス変数が存在しないためアクセスできません。

現在、 aCameraが作成されている場所 ( の外側) が表示されず、アクティブなビュー コントローラーになる可能性があるため、カスタム クラスではなくShowジェネリックを表示しているように見えます。UIImagePickerController

于 2013-04-02T14:16:17.717 に答える