在关键初始化期间显示“再试一次”UIAlertView

时间:2012-05-31 23:04:00

标签: ios objective-c uialertview

在应用程序初始化期间,我自然会有一些必须要做的关键事情才能让应用程序运行。例如,在这种情况下,我需要获取后置摄像头的AVCaptureDevice指针。

因此,如果它失败了(它永远不应该,但你永远不知道),我想只显示UIAlertView一个选项,“再试一次”。当用户选择此选项时,应用会尝试再次获取AVCaptureDevice

问题是我需要等待用户在继续之前按“再试一次”,但UIAlertView不是模态的。

如果只有这样的一段代码,我可能会使用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.
}

大多数步骤都需要检查它们是否成功,就像第一个步骤一样。

1 个答案:

答案 0 :(得分: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回调中调用此方法。

如果其中一个变量已经初始化,则由于if语句,它不会再次初始化。

您还可以在传递的每个步骤中设置一个名为step的int变量,并检查步骤变量以了解继续初始化所需的位置。