Obj.C

obj.C:WebViewのロードイベントを拾う

WebViewのtitleが適切に拾えないということと、WebViewのリンクをクリックしたときにイベント対応していないということは関係しているのではないかと考え、調査しています。

iOSのUIWebViewには– (void)viewDidLoadというメソッドがあるので、OS Xにもあるだろうと調べていたら、ようやく
– (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
}
にたどり着きました。このメソッドを動くようにするには、Interface Builderで「frameLoadDelegate」と「didFinishLoadForFrameを定義しているクラス(この例ではMesaCont)」とを接続する必要があります。

スクリーンショット 2014-04-16 18.57.05

このメソッドを使って、WebViewのURLがクリックされたかどうか調べればいいのではないでしょうか?説明には、Invoked when a page load completes.と書いてあります。pageが何を意味するかは横に置いておき、ロードが終わったときに呼ばれるということのようですから、良さそうな気がします。今夜、試してみて、あとで追記/updagteします。

追記1:この方法でうまく対処できました。

  • WebViewの中のURLがクリックされたとき制御がプログラムに戻らない問題を解決。
  • タイトル(ファイル名)とURLが適切に更新されない問題の解決。

didStartProvisionalLoadForFrame、didFinishLoadForFrame、didReceiveTitleの3種類でどれがいいか、組み合わせで使う方法も含めて、ない知恵を絞って考えたのですが、didStartProvisionalLoadForFrameを使うことにしました。直前のURLから変更があったときだけ必要な処理をすれば、オーバーヘッドをなくせます。と言うのは、1回だけ呼ばれて終わりではないからです。URLのロードが完了するまでに何回呼ばれるかカウントしてみればわかります。

追記:次の最初のif文のアルゴリズムには錯誤があるようです。右辺が常にnilなので、用法に誤りがあると考え、今、調査しています。あと、この場合、copyはつけない方がいいかもしれません。
➡ここで何かしないといけないのは確かです。トレースをとっても合理的な説明ができないのですが、if文を削除し、http:のURLであった場合、WebViewを編集可能にする[self ExecCheckAndResetURL];だけにしたら、URLの読み込みも、titleの更新もうまく行くようになりました。

スクリーンショット 2014-04-17 00.14.34

追記2:URLの読み込みからtitle検索を外しました。代わりに[xbWebView mainFrameTitle]を利用します。

スクリーンショット 2014-04-16 23.02.01

追記3:title検索は使う必要はありませんが、ロジックが必要なのでメソッドで切り出しました。ちなみにmcTitleをグローバル変数から変更するとエラーが出ます。なぜでしょう?

スクリーンショット 2014-04-16 22.45.09

Categories: Obj.C, 技術

Tagged as: ,