11

ユーザーがローカルに保存されたHTMLファイルの山をナビゲートできるアプリがあります。私は、UIWebViewを使用して正しく構成されていUIWebViewDelegateます。通常、ユーザーがリンクをたどると、shouldStartLoadWithRequestが呼び出されwebViewDidFinishLoad、少し後に呼び出されます。

ただし、リンクが現在表示されているページと同じページのアンカーを指している場合は、のみshouldStartLoadWithRequestが呼び出されます。webViewDidFinishLoad発火しません。

ある意味では、ページ内ナビゲーションではページの再読み込みは必要ないため、これは予想される動作である可能性があります。ただし、ページ内ナビゲーションが完了した後、コールスタックにフックする場所が本当に必要です。最適なソリューションは、別のページ、ページ内、および順方向/逆方向のアクションの両方から、あらゆる種類のナビゲーションが終了したときに通知します。

これまでの私の最善のハックアラウンドperformSelector: withObject: afterDelay:は、メソッドの最後に呼び出すことでしたshouldStartLoadWithRequestが、これには満足していません。

誰かが私がこれを正しく解決する方法を知っていますか?どんな洞察もありがたいです!

4

6 に答える 6

8

あなたは使用を試みることがNSURLConnectionDataDelegateできます、それはあなたが入ってくるデータを扱うことを可能にします。たぶん、HTMLファイルに記号を追加することで、ページが手動でロードされているかどうかを判断できます。

NSURLConnectionDataDelegateリファレンス

編集:gist.github.com/buranmert/7304047私はコードの一部を書きましたが、それは機能しました。それはあなたが望んでいた方法ではないかもしれませんが、おそらくそれは役立つでしょう。ユーザーがアンカー付きのURLをクリックするたびに、別の接続が作成され、接続がWebビューのロードを完了すると、データがロードされます。これは、Webビューがページのロードを終了したポイントを示します。ローカルのhtmlファイルのみを使用するため、接続を作成しても問題が発生することはないと思います

于 2013-11-04T09:39:44.630 に答える
6

あなたが説明しているのは意図された振る舞いです。AJAXまたはリソース要求がデリゲートに渡されないのと同様に、ルートページの変更のみがヒットしwebViewDidFinishLoad:ます。しかし、私には良いニュースがあります、そしてそれは自動車保険にたくさんのお金を節約することを含みません。

iFrame DO内で実行されたロードは、完全なデリゲートメソッドをトリガーし、これにより解決策が得られます。この投稿でconsole.log()説明されているように、このメカニズムを使用して、ネイティブコードに通知を投稿できます。または、ネイティブブリッジは、JavaScriptからObjectiveCコードを呼び出すのに適しています。

于 2013-11-07T16:28:24.490 に答える
2

天気をチェックするだけで、 DidFinishも呼び出されるはずであることが間違いなく呼び出された場合は、デリゲート関数DidStartLoadingを取得しました

于 2013-11-11T04:08:06.320 に答える
1

shouldStartLoadWithRequestが常にYESを返しますか?

私はいつも追加します

return YES;

shouldStartLoadWithRequest実装の最後に、それは私にとってはうまくいきます。YESを返すことにより、Webビューがロードされ、webViewDidFinishLoadを呼び出すことを示します

于 2013-11-05T08:32:16.193 に答える
1
if([webView isLoading]==1)
{
    //your webview is loading
}
else
{
   //your webview has loaded
}
于 2013-11-09T14:05:18.580 に答える
0

これは、誰かが探している場合に備えて、MertBuranのコードのSwift実装です。(NSURLConnectionはiOS 9で非推奨になりましたが)

しかし、それは私の問題を解決しません。ビデオをポップアップするjqueryリンクをクリックしても、webViewDidFinishLoadが起動しません。

class WebViewController: UIViewController, UIWebViewDelegate, NSURLConnectionDelegate {

var menuURL: String?

var response: NSURLResponse?
var data = NSData()

// MARK: Properties
@IBOutlet weak var webView: UIWebView!

override func viewDidLoad() {
    super.viewDidLoad()

    webView.delegate = self

    // From Web
    let url = NSURL (string: menuURL!)
    let urlRequest = NSURLRequest(URL: url!)

    let connection = NSURLConnection(request: urlRequest, delegate: self)
    self.data = NSData()
    connection!.start()

    // if this is false, page will be 'zoomed in' to normal size
    webView.scalesPageToFit = false

}

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == .LinkClicked && request.URL!.fragment != nil {
        let connection = NSURLConnection(request: request, delegate: self)
        connection!.start()
        return false
    }
    return true
}

func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {
    self.response = response
}

func connection(connection: NSURLConnection, didReceiveData data: NSData) {
    let oldData = NSMutableData(data: self.data)
    oldData.appendData(data)
    self.data = oldData
}

func connectionDidFinishLoading(connection: NSURLConnection) {
    self.webView.loadData(self.data, MIMEType: self.response!.MIMEType!, textEncodingName: "utf-8", baseURL: self.response!.URL!)
    self.data = NSData()
}


}
于 2016-08-24T12:58:15.737 に答える