2015-10-01 2 views
3

Я использую WKUIDelegate эту функцию для обработки JavaScript оповещенияWKWebView completionHandler вызывается перед увольнением

-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler 
{ 

    UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Test Alert", nil) 
                message:message 
                delegate:self 
              cancelButtonTitle:nil 
              otherButtonTitles:@"OK", nil] autorelease]; 

    [alert show]; 
    completionHandler(); 
} 

Согласно Apple, документации мы должны назвать compeletionHandler() предупредительную после нажатия кнопки ОК в состояние боевой готовности, как указано here

Как позвонить завершениюHandler() после нажатия кнопки OK нажата? Если я не называю completionHandler() expection брошено

**[WKWebViewController webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame: 
    completionHandler:]: 
***** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
    reason: 'Completion handler passed to -[WKWebViewController 
    webView:runJavaScriptAlertPanelWithMessage: 
    initiatedByFrame:completionHandler:] was not called'**** 

UPDATE:

Решение указанных ниже Стефаном работает нормально с JS оповещения, но не с JS Confirm. Ниже приведен код, в котором я получаю такое же исключение, даже если функция завершенияHandler() вызывается в порядке и отменить.

-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler 
{ 
    MKCLOG_DEBUG(@"%@", frame.request.URL); 
    UIAlertController* alert = [UIAlertController alertControllerWithTitle: 
           NSLocalizedString(@"Test", nil) message: message 
                  preferredStyle: UIAlertControllerStyleAlert]; 

    UIAlertAction *cancelAction = [UIAlertAction 
            actionWithTitle:NSLocalizedString(@"Cancel", @"") 
            style:UIAlertActionStyleCancel 
            handler:^(UIAlertAction *action) 
            { 
             MKCLOG_DEBUG(@"Cancel action"); 
             completionHandler(NO); 
            }]; 

    UIAlertAction *okAction = [UIAlertAction 
           actionWithTitle:NSLocalizedString(@"OK", @"OK action") 
           style:UIAlertActionStyleDefault 
           handler:^(UIAlertAction *action) 
           { 
            MKCLOG_DEBUG(@"OK action"); 
            completionHandler(YES); 
           }]; 

    [alert addAction:cancelAction]; 
    [alert addAction:okAction]; 
} 

ответ

4

Путь ваш код настройки теперь вы отобразить UIAlertView и сразу запустить completionHandler(). Оба происходят одновременно.

Что вы должны сделать, вместо того, чтобы что-то вроде этого:

UIAlertController* alert = [UIAlertController alertControllerWithTitle: 
    NSLocalizedString(@"Test Alert", nil) message: message 
     preferredStyle: UIAlertControllerStyleAlert]; 
UIAlertAction* defaultAction = [UIAlertAction actionWithTitle: @"OK" 
    style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { 
     completionHandler(); 
}]; 
[alert addAction:defaultAction]; 
[self presentViewController:alert animated:YES completion:nil]; 

Это представит предупреждение и вызвать completionHandler, когда пользователь закрывает его.

Обратите внимание, что я использую UIAlertController, который доступен только на iOS 8 и выше, но это должно быть хорошо, поскольку вы зависите от WKWebView.

+0

спасибо за ответ, указанный выше код работает для обработки JS Alert, но не с JS Confirm. Любая идея, как это сделать? – hariszaman

+0

Просто добавьте еще одну UIAlertAction для кнопки отмены. То же, что и выше, но с другим заголовком и правильным вызовом обработчику завершения. Почтовый код, если вам нужна помощь. –

+0

Я уже опубликовал его выше, если вы видите под UPDATE – hariszaman