Я использую 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];
}
спасибо за ответ, указанный выше код работает для обработки JS Alert, но не с JS Confirm. Любая идея, как это сделать? – hariszaman
Просто добавьте еще одну UIAlertAction для кнопки отмены. То же, что и выше, но с другим заголовком и правильным вызовом обработчику завершения. Почтовый код, если вам нужна помощь. –
Я уже опубликовал его выше, если вы видите под UPDATE – hariszaman