在Swift中将UIActivityIndicatorView与UIWebView一起使用
当url加载到WebView中时,我试图在我的应用程序中向用户显示活动指示器视图。我试过玩弄activity.startAnimating/activity.stop动画,并尝试将它们放在函数中,等等,但没有任何运气 我能得到的最好的结果就是活动指示器出现并设置动画,但在加载url后不会停止设置动画或隐藏,因此它会继续在网页顶部旋转 在其他情况下,当尝试在activity.startAnimating周围移动时,我遇到了“线程1:EXC\U BAD\U指令(代码=EXC\U I386\U INVOP,子代码=0x0)”问题。我在属性检查器中选中了“停止时隐藏”,我知道我的url是有效的,并且我已经为Interface Builder元素创建了IBOutlets 容忍我;我对斯威夫特比较陌生。这是我的密码:在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
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()
}
}