[swift] javascript 연동했는데 alert이 안뜰 때 ㅋㅋ
by 사슴비행기https://doorganizedcoding.tistory.com/31
Objective-C는 위에 참고.
ㅠㅠ 되게 간단한 문제다.
일단 문제 : <script></script> 코드 안에 alert("아무말"); 을 적어도 어떠한 alert도 뜨지 않는다. 그런데 해당 html 파일을 더블클릭하여 웹에서 열었을 경우, 대화상자가 아주 잘! 뜬다.
여기서 도출 할 수 있는 것은 일단, Swift에서 뭔가 설정을 잘못했기 때문이다.
바로 결론을 말하면,
네이티브에서 <script> 코드 안에서 사용한 alert이 작동하게 하려면 WKUIDelegate(WKWebView를 썼다고 가정)를 extension해서
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo, completionHandler: @escaping () -> Void)
해당 메소드를 정의해주어야 한다.
애플 개발문서에 보면
alert의 모습에 따라서 여러 메소드가 있는데
설명에 나와있듯이,
alert은 runJavaScriptAlertPanelWithMessage를 재정의하고
confirm은 runJavaScriptConfirmPanelWithMessage를 재정의하고
input은 runJavaScriptTextInputPanelWithPrompt를 재정의하면 된다.
Javascript에서는 alert은 버튼이 [확인] 한개이고
confirm은 버튼이 [취소] [확인] 두개이고
input은 .. 나도 모르는데 ㅋㅋㅋㅋ 암튼 이것도 대화상자에 입력필드가 있는 뭐시기였던 것 같다..
이건 나중에 수정하던지 더 공부해서 포스팅하던지 해야할 듯!
아무튼 WKWebView를 사용한다면 헤메지 말고 꼭 재정의 해주자.
//javaScript의 alert을 띄웁니다. [확인]버튼
func webView(_ webView: WKWebView, runJavaScriptAlertPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
completionHandler: @escaping () -> Void) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "확인", style: .default, handler: { (action) in
completionHandler()
}))
present(alertController, animated: true, completion: nil)
}
//javaScript의 alert을 띄웁니다. [확인], [취소]버튼
func webView(_ webView: WKWebView, runJavaScriptConfirmPanelWithMessage message: String, initiatedByFrame frame: WKFrameInfo,
completionHandler: @escaping (Bool) -> Void) {
let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "확인", style: .default, handler: { (action) in
completionHandler(true)
}))
alertController.addAction(UIAlertAction(title: "취소", style: .default, handler: { (action) in
completionHandler(false)
}))
present(alertController, animated: true, completion: nil)
}
//javaScript의 alert을 띄웁니다. [확인], [취소]버튼 + 텍스트 입력 패널
func webView(_ webView: WKWebView, runJavaScriptTextInputPanelWithPrompt prompt: String, defaultText: String?, initiatedByFrame frame: WKFrameInfo,
completionHandler: @escaping (String?) -> Void) {
let alertController = UIAlertController(title: nil, message: prompt, preferredStyle: .alert)
alertController.addTextField { (textField) in
textField.text = defaultText
}
alertController.addAction(UIAlertAction(title: "확인", style: .default, handler: { (action) in
if let text = alertController.textFields?.first?.text {
completionHandler(text)
} else {
completionHandler(defaultText)
}
}))
alertController.addAction(UIAlertAction(title: "취소", style: .default, handler: { (action) in
completionHandler(nil)
}))
present(alertController, animated: true, completion: nil)
}
'swift > code trim' 카테고리의 다른 글
swift rootViewController 하위 viewController 모두 삭제하기 (0) | 2019.12.30 |
---|---|
swift status bar color change(상태바 색 변경) (0) | 2019.12.30 |
webView 사용하기(WKWebView) (0) | 2019.08.05 |
Swift button text 변경하기 (0) | 2019.07.01 |
Swift SwipeGestureRecognizer 사용하기 (좌, 우) (0) | 2019.06.28 |
블로그의 정보
Beautiful Coding
사슴비행기