Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中将UIActivityIndicatorView与UIWebView一起使用_Swift_Uiwebview_Progress_Uiactivityindicatorview - Fatal编程技术网

在Swift中将UIActivityIndicatorView与UIWebView一起使用

在Swift中将UIActivityIndicatorView与UIWebView一起使用,swift,uiwebview,progress,uiactivityindicatorview,Swift,Uiwebview,Progress,Uiactivityindicatorview,当url加载到WebView中时,我试图在我的应用程序中向用户显示活动指示器视图。我试过玩弄activity.startAnimating/activity.stop动画,并尝试将它们放在函数中,等等,但没有任何运气 我能得到的最好的结果就是活动指示器出现并设置动画,但在加载url后不会停止设置动画或隐藏,因此它会继续在网页顶部旋转 在其他情况下,当尝试在activity.startAnimating周围移动时,我遇到了“线程1:EXC\U BAD\U指令(代码=EXC\U I386\U INV

当url加载到WebView中时,我试图在我的应用程序中向用户显示活动指示器视图。我试过玩弄activity.startAnimating/activity.stop动画,并尝试将它们放在函数中,等等,但没有任何运气

我能得到的最好的结果就是活动指示器出现并设置动画,但在加载url后不会停止设置动画或隐藏,因此它会继续在网页顶部旋转

在其他情况下,当尝试在activity.startAnimating周围移动时,我遇到了“线程1:EXC\U BAD\U指令(代码=EXC\U I386\U INVOP,子代码=0x0)”问题。我在属性检查器中选中了“停止时隐藏”,我知道我的url是有效的,并且我已经为Interface Builder元素创建了IBOutlets

容忍我;我对斯威夫特比较陌生。这是我的密码:

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")

}

首先,我没有看到UIWebView的授权。 了解您与委派流程相关的行为

UIWebViewDelegate有四种方法,但用于此方式的方法只有三种:

斯威夫特4 斯威夫特3
我相信您现在已经明白了,但是您需要连接
UIWebView
,通过拖动控件将其委托设置为故事板中的
UIViewController

您需要像这样将UIWebViewDelegate添加到类中

class HighchartsController: UIViewController, UIWebViewDelegate {
您还需要在viewDidLoad函数中将webView委托分配给self,如下所示

HighchartsView.delegate = self

以下是我在Xcode 8/Swift 3/iOS 10中始终遵循的三个简单步骤,以实现
UIWebView
页面加载指示器:

步骤1。
ViewController
类中为Web视图和负载指示器创建插座。例如:

@IBOutlet var loadSpinner: UIActivityIndicatorView!
@IBOutlet weak var webView: UIWebView!
这两行的左边应该有非空点

第2步。在情节提要中:控件将网络视图拖动到ViewController,然后从菜单中选择“委派”。正如GarySabo正确指出的,如果没有这一步,指示器将出现,但不会工作

步骤3。将以下代码添加到
ViewController
类中:

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

func webViewDidFinishLoad(_ : UIWebView) {
    loadSpinner.stopAnimating()
}

*WKWebView相当于dimpiax答案。使用WKNavigationDelegate

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) // show indicator 

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)  // hide indicator 

func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error)  // hide indicator*  

如果您使用的是WKWebView,请将WKNavigationDelegate设置为

webView.navigationDelegate = self

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    //Show loader
}    
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    //Hide loader
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    //Hide loader
}

调用委托方法。它工作正常。

除了在“类HighchartsController:UIViewController”之后添加UIWebViewDelegate和在“highchartsView.delegate=self”中添加UIWebview之外,我如何委派UIWebview?抱歉,我不熟悉Swift和Xcode。@agwin27您需要将UIWebview的协议
UIWebViewDelegate
委托给您的类,并实现订阅协议中描述的内部函数–
UIWebViewDelegate
。它应该是UIWebViewDelegate而不是UIWebViewDelegate。Thank.UIWebView现在已被弃用,我们必须使用WKWebView,这段代码现在是解决方案。但别忘了在viewDidLoad中添加webView.navigationDelegate=self。谢谢你,帕里昂
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) // show indicator 

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)  // hide indicator 

func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error)  // hide indicator*  
webView.navigationDelegate = self

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    //Show loader
}    
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    //Hide loader
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
    //Hide loader
}
extension WebViewController: WKNavigationDelegate {
    
    func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
        print("Start loading")
        LoadingIndicator.show()
    }
    
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("End loading")
        LoadingIndicator.hide()
    }
}