Во время инициализации приложения у меня, естественно, есть некоторые важные вещи, которые нужно сделать для запуска приложения. Например, в этом случае мне нужно получить указатель AVCaptureDevice
для задней камеры.Отображение «Попробовать еще раз» UIAlertView во время критической инициализации
Так что, если он терпит неудачу (он никогда не должен, но вы никогда не знаете), я хочу отобразить UIAlertView
только с одним вариантом: «Попробуйте еще раз». Когда пользователь выберет это, приложение попытается снова получить AVCaptureDevice
.
Проблема в том, что мне нужно дождаться, когда пользователь нажмет «Попробовать еще раз», прежде чем продолжить, но UIAlertView
не является модальным.
Если бы такой код был только один, я мог бы обработать его с помощью обратного вызова UIAlertViewDelegate
. Но так как это будет несколько критических частей инициализации, я не вижу, как я мог бы использовать обратный вызов, без того, что все становится очень грязным.
Есть ли элегантный способ справиться с этим?
Edit: Часть кода:
- (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.
}
Большинство шагов потребует проверки, если им это удалось, как и первый.
У вас всегда может быть unsigned char ivar, который вы устанавливаете каждый раз, прежде чем показывать alertview (0: n/a; 1; приобретать указатель на AVCaptureDevice; 2: читать значения по умолчанию, 3: тестировать терпение пользователя ...) как некоторую переменную состояния - вы проверите ее в своем методе делегирования, и вы сразу же узнаете, в чем причина показа оповещения. –
@rokjarc Да, но проблема в том, что мне нужно приостановить инициализацию до тех пор, пока 'UIAlertView' не будет уволен. –