2015-04-01 2 views
7

Я пытаюсь отобразить представление индикатора активности в приложении для пользователей, пока URL-адрес загружается в WebView. Я пытался работать с activity.startAnimating/activity.stopAnimating и попытался разместить их в функциях и т. Д., Но им не повезло.Использование UIActivityIndicatorView с UIWebView в Swift

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

В других ситуациях при попытке перемещения по Activity.startAnimating я столкнулся с проблемой «Thread 1: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)». У меня есть «Hides when Stopped», проверенный в инспекторе атрибутов, я знаю, что мой url действителен, и я создал IBOutlets для элементов интерфейса.

Медведь со мной; Я относительно новичок в Swift. Вот мой код:

class HighchartsController: UIViewController { 

@IBOutlet weak var HighchartsView: UIWebView! 

@IBOutlet weak var activity: UIActivityIndicatorView! 

@IBOutlet weak var saveButton: UIBarButtonItem! 

@IBOutlet weak var highchartsMenu: UIBarButtonItem! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    if self.revealViewController() != nil { 
     highchartsMenu.target = self.revealViewController() 
     highchartsMenu.action = "revealToggle:" 

     loadAddress() 
    } 
} 

func loadAddress() { 

    let url = NSURL (string: "http://google.com/flights") 
    let request = NSURLRequest (URL: url!) 
    HighchartsView.loadRequest(request) 
    println("Webpage Loaded Successfully") 
} 
} 

И я пытался использовать различные функции, такие как

webViewDidStartLoad(_ :UIWebView){ 

    activity.startAnimating() 
    NSLog("Webview load has started") 

} 
webViewDidFinishLoad(_ :UIWebView){ 

    activity.stopAnimating() 
    NSLog("Webview load had finished") 

} 

ответ

16

Прежде всего, я не вижу делегацию UIWebView. Поймите свое поведение, связанное с процессами делегирования.

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

Swift 4

func webViewDidStartLoad(_ webView: UIWebView) // show indicator  
func webViewDidFinishLoad(_ webView: UIWebView) // hide indicator 
func webView(_ webView: UIWebView, didFailLoadWithError error: Error) // hide indicator 

Swift 3

func webViewDidStartLoad(webView: UIWebView!) // show indicator 
func webViewDidFinishLoad(webView: UIWebView!) // hide indicator 
func webView(webView: UIWebView!, didFailLoadWithError error: NSError!) // hide indicator 
+0

вне добавления UIWebViewDelegate после 'класса HighchartsController: UIViewController' и добавление в 'highchartsView.delegate = я', как я делегировать UIWebview? Извините, я новичок в Swift и Xcode. – agwin27

+0

@ agwin27 вам необходимо делегировать протокол UIWebview 'UIWebViewDelegate' в ваш класс и реализовать внутри описанных функций в подписанном протоколе -' UIWebViewDelegate'. – dimpiax

3

Я уверен, что ты понял это сейчас, но вам необходимо подключить свой UIWebView, чтобы установить его делегат как ваш UIViewController в раскадровке путем перетаскивания.

3

Вам необходимо добавить UIWebViewDelegate в свой класс.

class HighchartsController: UIViewController, UIWebViewDelegate { 

Вам также необходимо назначить делегата webView для самостоятельной работы в функции viewDidLoad.

HighchartsView.delegate = self 
+0

Вместо UIWEBViewDelegate должен быть UIWebViewDelegate –

+0

Малый надзор. Благодарю. – Jackson

2

Ниже приведены три простых шага, которые я всегда следуют в Xcode 8/Swift 3/IOS 10 в целях реализации UIWebView страницы индикатор загрузки:

Шаг 1. Создание точек для Индикатор веб-представления и загрузки в классе ViewController. Например:

@IBOutlet var loadSpinner: UIActivityIndicatorView! 
@IBOutlet weak var webView: UIWebView! 

Эти две линии должны иметь непустые точки слева от них.

Шаг 2. В Раскадке: Управляйте перетаскиванием WebView в ViewController и выберите «делегировать» из меню. Как правильно указал GarySabo, без этого шага, индикатор появится, но не будет работать!

Шаг 3. Добавьте следующий код в ваш ViewController класс:

func webViewDidStartLoad(_ : UIWebView) { 
    loadSpinner.startAnimating() 
} 

func webViewDidFinishLoad(_ : UIWebView) { 
    loadSpinner.stopAnimating() 
} 
Смежные вопросы