2014-09-30 6 views
0

У меня есть контроллер A, который нажимает контроллер для сканирования кода. Когда код сканируется, он использует делегат для отправки строки обратно на контроллер A. Сразу после этого появляется контроллер сканирования. На данный момент нет проблем.Делегат посылает значение назад и толкает контроллер pop view

Но в делегате контроллера A мне нужно проверить результат и использовать эти данные. В некоторых случаях другой контроллер B должен быть нажат. Это не работает. Экран остается на контроллере сканирования, он просто мерцает 1 или менее.

Из того, что я понимаю, делегат нажимает контроллер B, когда контроллер сканирования находится на экране, и после этого вызывается вызов контроллера сканирования.

У меня есть это в моем контроллере сканирования:

if ([self.delegate respondsToSelector:@selector(QrcodeHasFound:)]) { 
    [self.delegate QrcodeHasFound:[metadataObj stringValue]]; 
} 

[self.navigationController performSelectorOnMainThread:@selector(popViewControllerAnimated:) withObject:nil waitUntilDone:NO]; 

И это в моем делегатом:

- (void)QrcodeHasFound:(NSString *)value{ 

// do some data use 

ArticleController *mController = [self.storyboard instantiateViewControllerWithIdentifier:@"articleController"]; 
[self.navigationController pushViewController:mController animated:YES]; 
} 

Как я должен исправить это?

ответ

0

Во-первых, вы захотите убедиться, что вы вызываете метод делегата в основном потоке. Прямо сейчас кажется, что вы вызываете метод делегата из фонового потока (исходя из того, что вы явно вставляете контроллер вида в основной поток). В методе делегата нажатие контроллера вида на фоновый поток может вызвать некоторые проблемы. Пример:

dispatch_async(dispatch_get_main_queue(), ^(void) { 

    if ([self.delegate respondsToSelector:@selector(QrcodeHasFound:)]) { 
     [self.delegate QrcodeHasFound:[metadataObj stringValue]]; 
    } 

    [[self navigationController] popViewControllerAnimated:YES]; 

}); 

Еще одна проблема, которая может возникнуть в том, что вы будете пытаться нажать контроллер вида, пока другой появится. Чтобы исправить это, я добавил бы задержку к методу pushViewController или задержку для метода делегата.

+0

С вашим кодом экран больше не мерцает, и я вижу, что контроллер вызова делегата B, но сразу же возвращается обратно в контроллер сканирования. Если я инвертирую две строки, чтобы иметь первый popViewControllerAnimated и вызвать делегата после этого, он работает нормально. Но я не знаю, можно ли после этого вызвать делегата. – Kamax

+0

Это будет совершенно безопасно. Хорошее наблюдение за заказом - рад, что исправил ваш второй вопрос. –

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