2013-03-27 14 views
11

我有一個應用程序,用戶可以在其中瀏覽一堆本地存儲的HTML文件。我有一個UIWebView,配置正確與UIWebViewDelegate。通常,當用戶關注鏈接時,將調用shouldStartLoadWithRequest,稍後再調用webViewDidFinishLoadUIWebViewDelegate:webViewDidFinishLoad在頁內導航期間未調用

但是,如果鏈接指向與當前顯示的頁面相同的頁面上的錨點,則只會調用shouldStartLoadWithRequestwebViewDidFinishLoad不會觸發。

從某種意義上說,我發現這可能是預期的行爲,因爲頁內導航不應該要求頁面重新加載。但是,在頁內導航完成後,我確實需要一個地方掛鉤調用堆棧。最佳的解決方案會讓我知道何時導航已經結束,無論是來自其他頁面,頁內和前進/後退動作。

到目前爲止,我最好的方法是在我的shouldStartLoadWithRequest方法結束時致電performSelector: withObject: afterDelay:,但我對此並不滿意。

有誰知道我該如何解決這個問題?任何洞察讚賞!

+0

我沒有看到shouldStartLoadWithRequest被調用任何錨點擊,只有整頁加載。我很好奇,如果這種行爲已經發生了變化,或者如果不行,我一定會做錯事。 – Jason 2014-06-24 16:31:14

回答

8

您可以嘗試使用NSURLConnectionDataDelegate,它允許您處理傳入數據。也許你可以通過在HTML文件中添加一個符號來確定頁面是否被手動加載。

NSURLConnectionDataDelegate Reference

編輯:gist.github.com/buranmert/7304047我寫了一段代碼,它的工作,這可能不是你想要它的工作,但也許它可以幫助的方式。每次用戶點擊帶有錨點的URL時,都會創建另一個連接,並且隨着連接完成加載Web視圖加載數據,這會標記Web視圖完成加載頁面的位置。由於您只使用本地html文件,我不認爲創建連接會產生問題

+0

感謝您的回答!在我看來,'NSURLConnectionDataDelegate'上的唯一方法就是'connectionDidFinishLoading'。閱讀方法描述,聽起來不太有希望,因爲頁內導航是否會觸發負載值得懷疑。不過,我會試試看。 – thomax 2013-11-04 12:04:31

+0

耶!我得到了這個工作!在我看來,這是迄今爲止最好的解決方案。非常感謝您花時間幫助我。賞金是你的,好先生! – thomax 2013-11-11 15:59:07

+0

其實,'webView.renderingFinished'上的回調/鉤子本來是100%完美的,但是這已經足夠接近了。 – thomax 2013-11-11 16:08:32

1

您確定您的shouldStartLoadWithRequest始終返回YES?

我總是在shouldStartLoadWithRequest implementation.And爲我的作品的末尾添加

return YES; 

。 通過返回YES,則表示該網頁流量已經加載並會召喚webViewDidFinishLoad

+1

Yepp,我敢肯定。 – thomax 2013-11-11 16:15:18

6

你所描述的預期行爲。就像AJAX或資源請求永遠不會傳遞給代理一樣,只有根頁面更改纔會觸及webViewDidFinishLoad:。但我有好消息,它不涉及在汽車保險上節省一筆錢。

在iFrame中執行的負載DO觸發完整的委託方法,併爲您提供解決方案。您可以使用此機制將通知發佈到本機代碼,就像in this post中描述的console.log()一樣。或者,Native Bridge可以很好地從JavaScript調用您的Objective C代碼。

+0

+1我相信這會起作用,但它比Mert Buran提供的更多iOS-ish建議更像是一種黑客攻擊。不過謝謝你的幫忙! – thomax 2013-11-11 16:03:14

1
if([webView isLoading]==1) 
{ 
    //your webview is loading 
} 
else 
{ 
    //your webview has loaded 
} 
+0

是的,但輪詢webView的加載狀態不是OS回調/掛鉤,而是相反。 – thomax 2013-11-11 16:17:12

2

只是檢查的天氣你長了委託函數DidStartLoading,如果它被稱爲毫無疑問,DidFinish也應該得到所謂

+0

不,它不會通過URL上的片段調用頁內導航。 – thomax 2013-11-11 16:14:25

+0

檢查天氣** webView:shouldStartLoadWithRequest:navigationType:**返回「NO」,另一種可能性是webview委託設置爲「無」 – Nagaraj 2013-11-12 04:37:15

+1

'shouldStartLoadWithRequest'返回YES並且委託設置正確。這實際上是我的問題的前提。 – thomax 2013-11-12 07:53:59

0

這裏是梅特暴風雪的代碼櫃面任何一個迅速執行尋找它。 (雖然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() 
} 


}