在应用程序初始化期间,我自然会有一些必须要做的关键事情才能让应用程序运行。例如,在这种情况下,我需要获取后置摄像头的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.
}
大多数步骤都需要检查它们是否成功,就像第一个步骤一样。
答案 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变量,并检查步骤变量以了解继续初始化所需的位置。