0

アプリの初期化中に、当然のことながら、アプリを実行するために実行しなければならないいくつかの重要なことがあります。たとえば、この場合AVCaptureDevice、背面カメラのポインターを取得する必要があります。

したがって、失敗した場合 (失敗することはありませんが、わかりません)、UIAlertView「再試行」という 1 つのオプションだけを表示したいと思います。ユーザーがこれを選択すると、アプリはAVCaptureDevice再度取得を試みます。

問題は、続行する前にユーザーが「再試行」を押すのを待つ必要があることですが、UIAlertViewモーダルではありません。

このようなコードが 1 つしかない場合は、UIAlertViewDelegateコールバックで処理できる可能性があります。しかし、このような初期化の重要な部分が複数あるため、本当に混乱することなくコールバックを使用する方法がわかりません。

これを処理するエレガントな方法はありますか?

編集:いくつかのコード:

- (void)setup
{
    NSError *error = nil;

    // get all the video devices. (this should be the back camera and the front camera.)
    NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

    AVCaptureDevice *backVideoDevice;

    // find the back camera.
    do 
    {
        for (AVCaptureDevice *videoDevice in videoDevices)
        {
            if (videoDevice.position == AVCaptureDevicePositionBack)
            {
                backVideoDevice = videoDevice;

                break;
            }
        }

        if (backVideoDevice == nil)
        {
            // display UIAlertView???
        }

    } while (backVideoDevice == nil);

    // if no back camera was found, then we can't continue.

    AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:backVideoDevice error:&error];

    AVCaptureStillImageOutput *stillImageOutput = [AVCaptureStillImageOutput new];

    AVCaptureSession *captureSession = [AVCaptureSession new];

    if ([captureSession canAddInput:videoDeviceInput])
    {
        [captureSession addInput:videoDeviceInput];
    }

    if ([captureSession canAddOutput:stillImageOutput])
    {
        [captureSession addOutput:stillImageOutput];
    }

    // etc, etc.
}

最初の手順のように、ほとんどの手順では、成功したかどうかを確認する必要があります。

4

1 に答える 1

0

そのような初期化メソッドを用意するだけです:

- (void)initDevice {
  // If x device is not already initialized
  if (!_x) {
    _x = ...

    if (/* some error with _x initialization */) {
      // Show the alert view
      ...

      // Exit initialization
      return;
    }
  }

  ...
}

そして、初期化を開始する場所と UIAlertViewDelegate コールバックでこのメソッドを呼び出します。

変数の 1 つが既に初期化されている場合、if ステートメントにより再度初期化されることはありません。

また、渡された各ステップで設定する step と呼ばれる int 変数を使用し、step 変数をチェックして、初期化を続行する必要がある場所を確認することもできます。

于 2012-05-31T23:11:45.987 に答える