2013-03-27 1 views
11

У меня есть приложение, в котором пользователи могут перемещаться по кучке локально сохраненных файлов HTML. У меня есть UIWebView, правильно настроенный с UIWebViewDelegate. Обычно, когда пользователь следует по ссылке, вызывается shouldStartLoadWithRequest, а затем webViewDidFinishLoad чуть позже.UIWebViewDelegate: webViewDidFinishLoad не вызывается во время навигации по странице

Но, если ссылка указывает на якорь на той же странице, что и отображаемая в данный момент, вызывается только shouldStartLoadWithRequest. webViewDidFinishLoad не срабатывает.

В некотором смысле я вижу, что это можно ожидать, потому что навигация по страницам не требует перезагрузки страницы. Тем не менее, мне действительно нужно место, чтобы подключиться к стеку вызовов после завершения навигации по странице. Оптимальное решение сообщит мне, когда какая-либо навигация закончилась, как с другой страницы, так и на странице и вперед/назад.

Мой лучший хакер до сих пор должен был позвонить performSelector: withObject: afterDelay: в конце моего метода shouldStartLoadWithRequest, но я не доволен этим.

Кто-нибудь знает, как я могу решить это правильно? Любое понимание оценили!

+0

Я не вижу, чтобы shouldStartLoadWithRequest получал вызов для любого якорного щелчка, только полная загрузка страницы. Мне любопытно, изменилось ли это поведение, а если нет, я должен делать что-то неправильно. – Jason

ответ

8

Вы можете использовать NSURLConnectionDataDelegate, что позволяет обрабатывать поступающие данные. Возможно, вы можете определить, загружена ли страница вручную, добавив знак в ваши html-файлы.

NSURLConnectionDataDelegate Reference

Edit: gist.github.com/buranmert/7304047 я написал кусок кода, и он работал, что не может быть так, как вы хотели, чтобы работать, но, возможно, это помогает. Каждый раз, когда пользователь нажимает на URL с якорем, он создает другое соединение, и по завершении подключения загрузка веб-представления загружает данные, что указывает на то, что веб-представление закончило загрузку страницы. Поскольку вы используете только локальные html-файлы, я не думаю, что создание соединений создаст проблемы

+0

Спасибо за ответ! Единственный метод в 'NSURLConnectionDataDelegate', который, кажется, имеет какой-либо потенциал в моем случае, -' connectionDidFinishLoading'. Читая описание метода, это не кажется слишком многообещающим, поскольку сомнительно, что навигация на странице вызовет нагрузку. Однако я попробую. – thomax

+0

Yay! Я получил эту работу! На наш взгляд, самое лучшее решение, предложенное здесь. Большое спасибо за то, что нашли время, чтобы помочь мне. Щедрость твоя, добрый сэр! – thomax

+0

Фактически, обратный вызов/крючок на 'webView.renderingFinished' был бы на 100% идеальным, но это достаточно близко. – thomax

1

Вы уверены, что ваш shouldStartLoadWithRequest всегда возвращает ДА ​​???

Я всегда добавляю

return YES; 

в конце shouldStartLoadWithRequest implementation.And, который работает для меня. Возвращая YES, это означает, что загрузится WebView и назвали бы webViewDidFinishLoad

+1

Yepp, я уверен. – thomax

6

То, что вы описываете предназначено поведение. Подобно тому, как AJAX или запросы ресурсов никогда не передаются делегату, только изменения корневой страницы когда-либо будут удалены webViewDidFinishLoad:. Но у меня хорошие новости, и это не связано с сохранением кучу денег на страхование автомобилей.

Нагрузки, выполняемые в iFrame DO запускают все методы делегата, и это дает вам решение. Вы можете использовать этот механизм для отправки уведомления на собственный код, как это часто делается для console.log(), как описано in this post. Альтернативно, Native Bridge будет хорошо работать, чтобы вызвать ваш код Objective C из JavaScript.

+0

+1 Я уверен, что это сработает, но это скорее похоже на взлома, чем больше предложений iOS-ish от Mert Buran. Спасибо большое за помощь, хотя! – thomax

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

Да, но опрос webView для его состояния загрузки - это не обратный вызов/крючок ОС, а наоборот. – thomax

2

Просто проверить погоду U Got функции делегата DidStartLoading если он называется, без сомнения, что DidFinish также должен дозвонился

+0

Нет, он не получает вызовы на странице навигации с фрагментом на URL. – thomax

+0

Проверить погоду ** webView: shouldStartLoadWithRequest: navigationType: ** возвращает «NO», а другая возможность - делегат webview, установлен на «nil» – Nagaraj

+1

'shouldStartLoadWithRequest' возвращает' YES', и делегат установлен правильно. Это, по сути, предпосылка для моего вопроса. – thomax

0

Вот Swift Реализация кода Mert Бурана в упаковывают кого ищут Это. (Хотя 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() 
} 


} 

 Смежные вопросы

  • Нет связанных вопросов^_^