2012-05-31 4 views
0

Во время инициализации приложения у меня, естественно, есть некоторые важные вещи, которые нужно сделать для запуска приложения. Например, в этом случае мне нужно получить указатель 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. 
} 

Большинство шагов потребует проверки, если им это удалось, как и первый.

+0

У вас всегда может быть unsigned char ivar, который вы устанавливаете каждый раз, прежде чем показывать alertview (0: n/a; 1; приобретать указатель на AVCaptureDevice; 2: читать значения по умолчанию, 3: тестировать терпение пользователя ...) как некоторую переменную состояния - вы проверите ее в своем методе делегирования, и вы сразу же узнаете, в чем причина показа оповещения. –

+0

@rokjarc Да, но проблема в том, что мне нужно приостановить инициализацию до тех пор, пока 'UIAlertView' не будет уволен. –

ответ

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.

Вы также можете иметь переменную типа int, которую вы задали на каждом шаге, и проверить переменную шага, чтобы узнать, где вам нужно продолжить инициализацию.

+0

Я начал это делать, но это не сработает, потому что я должен приостановить оставшуюся часть инициализации до тех пор, пока пользователь не нажмет «Попробовать еще раз». –

+0

просто выйдите из метода инициализации, если произошла ошибка, я отредактировал этот ответ, чтобы отразить это. – Johnmph

+0

Но проблема в том, что мой общий метод инициализации, мне нужно приостановить его до тех пор, пока метод initDevice не будет успешным. –

Смежные вопросы