WKWebViewで最初に読み込んだページに戻る
WKWebViewの最初に読みこんだページ(URL)に戻りたいことがあったので、いろいろ調べたらwebView.goToBackForwardListItem(item: WKBackForwardListItem)
で実現できました。
let webView = WKWebView() let count = webView.backForwardList.backList.count guard let rootItem = webView.backForwardList.itemAtIndex(-count) else { return } webView.goToBackForwardListItem(rootItem)
解説
backForwardList
で戻る履歴の数を取得します。わざわざ履歴の数を取得するのは、最初のページのWKBackForwardListItemを取得するwebView.backForwardList.itemAtIndex(index: Int)
で指定するindex
が現在のページからの相対値になるので、履歴数をマイナスで指定する必要があります。
取得したらそのWKBackForwardListItemをgoToBackForwardListItem
に渡すだけです。
loadRequestではだめな理由
この方法を使う以外だと、最初に読み込んだURLを保存しておいて、そのURLをloadRequest
で読み込むという方法が思い付きました。
ですが、今回はUIとしてあくまで「履歴の最初に戻る」というイメージが持てるような動作にしたいという要件がありました。
loadRequest
の場合、履歴のスタックに最新の履歴として、そのリクエストが載ってしまい要件が満たせません(goBack
で戻れてしまう)。
まとめ
goToBackForwardListItem(rootItem)
- 戻る履歴は「0」になる(履歴の最初に戻るので)
- 進む履歴は維持される
- イメージ:
- ■□□□□□□□
loadRequest(firstPageRequest)
- 履歴の先頭に
firstPageRequest
が載るため、戻る履歴は維持される - このリクエストが履歴の先頭になるので、進む履歴は無い
- イメージ:
- □□□□□□□□■
goToBackForwardListItem(rootItem)
の場合より、履歴の数は1つ多くなる
- 履歴の先頭に