2017-02-20 16 views
0

Everytime я пытаюсь загрузить другой URL на UIWebView я получаю ту же ошибку:UIWebView не загружая новый адрес

SendDelegateMessage(NSInvocation *): delegate (webView:decidePolicyForNavigationAction:request:frame:decisionListener:) failed to return after waiting 10 seconds.

Мой код о WebView, как:

@IBAction func changeUrl(sender: UIButton) { 
    if LEDON { 
     let urlStr = NSString(format: "%@/?Led=0", self.url) 
     let req = URLRequest(url: URL(string: urlStr as String)!) 
     webView.loadRequest(req) 
     while(webView.isLoading) { 
      sender.isEnabled = false 
     } 
     sender.isEnabled = true 
     LEDON = false; 
    } else { 
     let urlStr = NSString(format: "%@/?Led=1", self.url) 
     let req = URLRequest(url: URL(string: urlStr as String)!) 
     webView.loadRequest(req) 
     while(webView.isLoading) { 
      sender.isEnabled = false 
     } 
     sender.isEnabled = true 
     LEDON = true; 
    } 
} 

Если я нажму UIButton в первый раз, когда код работает отлично, но когда я снова нажимаю его, я получаю эту ошибку. Где я делаю неправильно?

переменная «url» в коде является глобальным var, и я уже проверяю, что это правильно.

+0

Вам не нужно использовать это время (webView.isLoading) {sender.isEnabled = ложный}. Вы заморозили основной поток, и приложение не может отвечать на запросы. Для этого вам нужны методы делегата. – Sergey

+0

Но когда цикл while завершен, отправитель снова активен. Когда я снова вызываю действие, webView не загружается, но кнопка работает. – Francesco

ответ

1

Проблема в

while(webView.isLoading) { 
    sender.isEnabled = false 
} 

Вы заморозили основной нить и webView: solvePolicyForNavigationA ction: request: frame: decisionListener: не может быть вызван.

Попробуйте использовать это:

func viewDidLoad() 
{ 
    ... 
    webView.delegate = self;//UIWebView 
    //webView. navigationDelegate = self;//WKWebView 
} 

@IBAction func changeUrl(sender: UIButton) { 
    if LEDON { 
     let urlStr = NSString(format: "%@/?Led=0", self.url) 
     let req = URLRequest(url: URL(string: urlStr as String)!) 
     webView.loadRequest(req) 
     sender.isEnabled = false 
     LEDON = false; 
    } else { 
     let urlStr = NSString(format: "%@/?Led=1", self.url) 
     let req = URLRequest(url: URL(string: urlStr as String)!) 
     webView.loadRequest(req) 
     sender.isEnabled = false 
     LEDON = true; 
    } 
} 

Для UIWebView вам нужно использовать

func webViewDidFinishLoad(UIWebView) 
{ 
    yourButton.isEnabled = true 
} 

Для WKWebView

func webView(_ webView: WKWebView, 
      didFinish navigation: WKNavigation!) 
{ 
    yourButton.isEnabled = true 
} 

=========== ===========================

Если вы хотите использовать в то время как попытка цикла, чтобы изменить его для этого:

while(webView.isLoading) { 
    sender.isEnabled = false 
    RunLoop.current.run(until: Date(timeIntervalSinceNow: 0.5)) 
} 
+0

Большое спасибо! – Francesco

1

Вы должны разрешить HTTP и HTTPS на вашем приложении:

В вашем info.plist:

In Info.plist file add a dictionary with key 'NSAppTransportSecurity'

Add another element inside dictionary with key 'Allow Arbitrary Loads'

enter image description here

+0

Уже сделано! Первый раз правильно загружен URL. Проблема в другом случае – Francesco

+0

работает для меня! спасибо –