2015-06-15 4 views
1

Я использую SWRevealViewController segue, который вызывается методом, но не запускается. В журнал не сообщается об ошибках, и это не приводит к зависанию или сбою приложения. Я проверил ссылку segue на раскадровке, и у нее есть правильный класс и идентификатор.iOS: Программно называется segue not working

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSURL *url = [NSURL URLWithString:loadUrl]; 
    NSLog(loadUrl); 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
    { 
     if([data length] > 0 && error == nil) 
      [mWebView loadRequest:request];   
     else if (error != nil) 
      NSLog(@"Error: %", error);} 
    ];  
} 

- (void)  captureOutput:(AVCaptureOutput *)captureOutput 
    didOutputMetadataObjects:(NSArray *)metadataObjects 
      fromConnection:(AVCaptureConnection *)connection 
{ 
    [metadataObjects 
    enumerateObjectsUsingBlock:^(AVMetadataObject *obj, 
           NSUInteger idx, 
           BOOL *stop) 
    { 
     if ([obj isKindOfClass: 
       [AVMetadataMachineReadableCodeObject class]]) 
     { 
     // 3 
      AVMetadataMachineReadableCodeObject *code = 
      (AVMetadataMachineReadableCodeObject*) 
      [_previewLayer transformedMetadataObjectForMetadataObject:obj]; 
     // 4 
      Barcode * barcode = [Barcode processMetadataObject:code]; 

      for(NSString * str in self.allowedBarcodeTypes){ 
       if([barcode.getBarcodeType isEqualToString:str]){ 
        [self validBarcodeFound:barcode]; 
        return; 
       } 
      } 
     } 
    }]; 
} 


- (void) validBarcodeFound:(Barcode *)barcode{ 

    [self stopRunning]; 
    [self.foundBarcodes addObject:barcode]; 

    NSString *input = [barcode getBarcodeData]; 
    [NSString stringWithFormat:@"%lu",(unsigned long) [self.foundBarcodes count]-1]; 

    if ([input length] >= 13) 
    { 
     input = [input substringToIndex:12]; 
    } 

    loadUrl = [[@"http://www.mywebsite.com/" stringByAppendingString:input] stringByAppendingString:@"?utm_source=iphone"]; 
    [super viewDidLoad]; 
    [self performSegueWithIdentifier:@"toWebControl" sender:self]; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    [super viewDidLoad]; 
} 
+3

Почему все вызовы '[super viewDidLoad]'? Это следует вызывать только изнутри 'viewDidLoad'? Мне также нужно показать больше кода. То есть, что вызывает 'validateBarcodeFound' и когда? Возможно, я переместил бы ваш код запроса в 'viewWillAppear', чтобы вы знали, что ваш интерфейс полностью настроен. –

+2

убедитесь, что вы выполняете свой сеанс в главной очереди. Я вижу, что ваш обратный вызов асинхронного запроса выполняется на отдельном NSOperationQueue, поэтому вам нужно 'dispatch_async' передать' dispatch_get_main_queue' код, выполняющий segue. –

+0

@ Sega-Zero был прав. Большое спасибо! – tonyony

ответ

1

Всегда выполняйте сеанс в главной очереди. Ваш обратный вызов выполняется в отдельном NSOperationQueue, вам необходимо обернуть performSegueWithIdentifier в dispatch_async(dispatch_get_main_queue,....

Плюс, как указано в комментариях @ rory-mckinnel, удалить ненужные вызовы [super viewDidLoad] как может привести к неожиданным результатам.

+0

Сохраненный мой день :) – Jagan