WKWebView を継承したカスタムクラスで Web ページが表示されなくなった

表題の通りで、 WKWebView を継承したカスタムクラスを作って色々いじっていたら、 Web ページが表示されなくなってしまいました。

  • 何も表示されず真っ白
  • スクロールやピンチイン・ピンチアウトはできる
  • スクロールできる量は表示したい Web ページと同じっぽい
f:id:takasfz:20180413194035p:plain

原因は、 didMoveToWindow をオーバーライドしたときに、スーパークラスのメソッドを呼んでいないことでした。 UIView のドキュメントには「このメソッドのデフォルト実装は何もしない」と書いてあったのと WKWebView のドキュメントでも特に触れられていなかったので油断していたんですが、 WKWebView の実装ではこのメソッドで状態の変更を通知しているのですね。

didMoveToWindow() - UIView | Apple Developer Documentation

The default implementation of this method does nothing. Subclasses can override it to perform additional actions whenever the window changes.

WKWebView.mm - WebKit/webkit - Sourcegraph

- (void)didMoveToWindow
{
    _page->activityStateDidChange(WebCore::ActivityState::AllFlags);
}

オーバーライドしたメソッドで super.didMoveToWindow() を呼ぶと、ちゃんと表示されるようになりました。

f:id:takasfz:20180413194048p:plain

「 window オブジェクトの変更を通知してくれるメソッド」くらいの理解だったのであんまり深く考えていなかったのですが、処理を上書きしたい明確な意図がない限りは、メソッドをオーバーライドしたらちゃんとスーパークラスのメソッドを呼ぼうと思いました。


出典: