質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

2465閲覧

IOSアプリがいくつか反応しない。(WKWebView関連)

isekiryu

総合スコア15

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/09/02 01:44

編集2020/09/02 11:33

イメージ説明### 前提・実現したいこと
ドットインストール でブラウザーアプリを学んでいました。
このサイトでは、UIWebViewでアプリを作成していました。私も同じようにやってみてたのですがいくつかの要素が動きません。
WKWebViewに切り替える必要があると思いました。しかし、始めたばかりでどこを修正していいのかわかりません。ご教授していただければ幸いです。

発生している問題・エラーメッセージ

読み込むoutletが機能しない。 URLが表示されない。 ボタンが非表示にならない。

試したこと

ViewControlle.swiftでいくつかWKWebViewのコードを入れてみました。

補足情報(FW/ツールのバージョンなど)

viewController.swift

1// 2// ViewController.swift 3// BrowserApp 4// 5// Created by user on 2020/08/31. 6// Copyright © 2020 user. All rights reserved. 7// 8 9import UIKit 10import WebKit 11 12class ViewController: UIViewController, WKUIDelegate, UITextFieldDelegate { 13 14 15 var webView: WKWebView! 16 17 @IBOutlet weak var urlTextField: UITextField! 18 @IBOutlet weak var browserWebView: WKWebView! 19 20 @IBOutlet weak var backButton: UIBarButtonItem! 21 @IBOutlet weak var forwardButton: UIBarButtonItem! 22 @IBOutlet weak var reloadButton: UIBarButtonItem! 23 24 @IBOutlet weak var browserActivityIndicatorView: UIActivityIndicatorView! 25 26 override func viewDidLoad() { 27 super.viewDidLoad() 28 29 self.browserWebView.uiDelegate = self 30 self.urlTextField.delegate = self 31 self.browserActivityIndicatorView.hidesWhenStopped = true 32 // Do any additional setup after loading the view, typical from a nib. 33 } 34 35 func textFieldShouldReturn(_ textField: UITextField) -> Bool { 36 if textField != self.urlTextField { 37 return true 38 } 39 if let urlString = textField.text { 40 self.loadUrl(urlString: urlString) 41 } 42 return true 43 } 44 45 func textFieldDidBeginEditing(_ textField: UITextField) { 46 if textField != self.urlTextField { 47 return 48 } 49 textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument) 50 } 51 52 func webViewDidStartLoad(_ webView: WKWebView) { 53 self.browserActivityIndicatorView.startAnimating() 54 } 55 56 func webViewDidFinishLoad(_ webView: WKWebView) { 57 if let urlString = self.browserWebView.url?.absoluteString 58 { 59 self.urlTextField.text = urlString 60 } 61 self.browserActivityIndicatorView.stopAnimating() 62 self.backButton.isEnabled = self.browserWebView.canGoBack 63 self.forwardButton.isEnabled = self.browserWebView.canGoForward 64 } 65 66 override func viewDidAppear(_ animated: Bool) { 67 super.viewDidAppear(animated) 68 let urlString = "http://dotinstall.com" 69// let urlString = "" 70 self.loadUrl(urlString: urlString) 71 self.addBorder() 72 } 73 74 func addBorder() { 75 let topBorder = CALayer() 76 topBorder.frame = CGRect(x: 0.0, y: 0.0, width: self.browserWebView.frame.size.width, height: 1.0) 77 topBorder.backgroundColor = UIColor.lightGray.cgColor 78 self.browserWebView.layer.addSublayer(topBorder) 79 } 80 81 82 func showAlert(_ message: String) { 83 let alertController = UIAlertController(title: "Error", message: message, preferredStyle: .alert) 84 let defaultAction = UIAlertAction(title: "OK", style: .default, handler: nil) 85 alertController.addAction(defaultAction) 86 self.present(alertController, animated: true, completion: nil) 87 } 88 89 90 func webView(_ webView: WKWebView, didFailLoadWithError error: Error) { 91 if (error as! URLError).code == URLError.cancelled { 92 return 93 } 94 self.showAlert("Network Error") 95 self.browserWebView.stopLoading() 96 self.browserActivityIndicatorView.stopAnimating() 97 } 98 99 func getValidatedUrl(urlString: String) -> URL? { 100 let trimmed = urlString.trimmingCharacters(in: NSCharacterSet.whitespaces) 101 if URL(string: trimmed) == nil { 102 // print("Invalid URL") 103 self.showAlert("Invalid URL") 104 return nil 105 } 106 return URL(string: self.appendScheme(trimmed)) 107 } 108 109 func appendScheme(_ urlString: String) -> String { 110 if URL(string: urlString)?.scheme == nil { 111 return "http://" + urlString 112 } 113 return urlString 114 } 115 116 func loadUrl(urlString: String) { 117 if let url = self.getValidatedUrl(urlString: urlString) { 118 let urlRequest = URLRequest(url: url) 119 self.browserWebView.load(urlRequest) 120 } 121 } 122 123 124 override func didReceiveMemoryWarning() { 125 super.didReceiveMemoryWarning() 126 // Dispose of any resources that can be recreated. 127 } 128 129 130 131 @IBAction func goBack(_ sender: Any) { 132 self.browserWebView.goBack() 133 } 134 135 @IBAction func goForward(_ sender: Any) { 136 self.browserWebView.goForward() 137 } 138 139 @IBAction func reload(_ sender: Any) { 140 self.browserWebView.reload() 141 } 142 143} 144 1458

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

少なくとも、指定したURLが表示されない問題は次の設定を行うことで解決できるかと思います。

読み込みがうまく行われない場合、たとえば次のような delegate を設定しておくと、その原因がわかりやすくなるかと思います。

Swift

1// WKNavigationDelegate を追加 2class ViewController: UIViewController, WKUIDelegate, UITextFieldDelegate, WKNavigationDelegate { 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 // 略 7 browserWebView.navigationDelegate = self 8 } 9 // 略 10 11 func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError: Error) { 12 print("読込失敗") 13 print(withError.localizedDescription) 14 } 15}

その他、動かない理由については、「具体的にどのような操作を行った時に何ができないのか」を詳しく説明していただければと思います。

少なくとも、指定URLの表示、ボタンを使ったページの移動、再読み込みはできました。

投稿2020/09/02 09:05

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

isekiryu

2020/09/02 11:34

ありがとうございます。 変更してみました。しかし、変わりませんでした。 func webView(_ webView: WKWebView, didFailLoadWithError withError: Error) { if (withError as! URLError).code == URLError.cancelled { print ("読込失敗" ) print(withError.localizedDescription) } //self.showAlert("Network Error") //self.browserWebView.stopLoading() //self.browserActivityIndicatorView.stopAnimating() }
TsukubaDepot

2020/09/02 12:57

書き換えるのではなく、追加することになります。 func webView(_ webView: WKWebView, didFailLoadWithError withError: Error) ではなく、 func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError: Error) です。 それに従い、WKNavigationDelegate プロトコルの追加と(回答のコード1つ目のコメント部分)、navigationDelegate の設定(コメント2つ目)が必要となります。 読み込みに失敗していれば、具体的なエラーメッセージがコンソールに表示されるはずです。 ちなみに、基本的なコードは間違っていないので、ATS の設定(「http://」のAPIを実行できるようにする(Swift)のリンク先)が正しく設定できれいれば、ご提示のコードで動きます(確認しました)。 それでも動かないのであれば、ボタンの Outlet などが外れているのではないでしょうか。
isekiryu

2020/09/02 13:50

ご指摘ありがとうございます。 override func viewDidLoad() { super.viewDidLoad() self.browserWebView.uiDelegate = self self.urlTextField.delegate = self self.browserActivityIndicatorView.hidesWhenStopped = true browserWebView.navigationDelegate = self // Do any additional setup after loading the view, typical from a nib. } func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError: Error) { print("読込失敗") print(withError.localizedDescription) } それに従い、WKNavigationDelegate プロトコルの追加と(回答のコード1つ目のコメント部分)、navigationDelegate の設定(コメント2つ目)が必要となります。 読み込みに失敗していれば、具体的なエラーメッセージがコンソールに表示されるはずです。 これらは、追加すればいいのでしょうか?始めたばかりなので理解できている部分が少なくてすみません。
TsukubaDepot

2020/09/02 19:42

class ViewController: UIViewController, WKUIDelegate, UITextFieldDelegate { の行を class ViewController: UIViewController, WKUIDelegate, UITextFieldDelegate, WKNavigationDelegate { と書き換え、 override func viewDidLoad() { 内に browserWebView.navigationDelegate = self を追加、 また、クラス内に func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError: Error) { print("読込失敗") print(withError.localizedDescription) } を追加してみてもらえますでしょうか。 それに加え、 回答内のリンク 「http://」のAPIを実行できるようにする(Swift) 内の指示にしたがってATSの設定(たぶん、これは既に行われていると思いますが)をする。 をやってみてもらえますでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問