【问题标题】:Xcode Swift - WKWebView implementationXcode Swift - WKWebView 实现
【发布时间】:2021-01-12 15:33:33
【问题描述】:

我目前正在尝试使用 Swift 在 Xcode 的导航页面中实现一个简单的WKWebView,但是,一旦我切换到专用页面,应用程序就会崩溃并引发以下异常:

2021-01-12 16:24:40.981110+0100 SmartMirror[2078:1089320] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[WKWebView 视图]:无法识别的选择器发送到实例 0x11380c400”

我还使用了一个活动指示器,它应该在页面加载之前显示。这是我的代码:ThirdViewController.swift

import UIKit
import WebKit

class ThirdViewController: UIViewController, WKUIDelegate {
    
    @IBOutlet var webView: WKWebView!
    @IBOutlet var activityIndicator: UIActivityIndicatorView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let url = URL(string: "http://192.168.178.34:8080/")
        let request = URLRequest(url: url!)
        webView.load(request)
        webView.addObserver(self, forKeyPath: #keyPath(WKWebView.isLoading), options: .new, context: nil)
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        
        if keyPath == "loading" {
            
            if webView.isLoading {
                activityIndicator.startAnimating()
                activityIndicator.isHidden = false
            }else {
                activityIndicator.stopAnimating()
                activityIndicator.isHidden = true
            }
            
        }
        
    }
    
}

这是我的故事板,每个页面都有自己的视图:

https://i.stack.imgur.com/nFFlH.jpg

我们将不胜感激!

真诚地, 卢卡斯

【问题讨论】:

  • 我测试了你的代码,我在else 语句中的activityIndicator 上有一个nil 值。但你写的是不同的错误。如果我评论这些行,它可以与另一个 url 一起正常工作。
  • 我用“google.com”尝试了同样的事情,我得到了和以前一样的错误。我觉得它与我的 ViewController 有关,但我不能说。你只用了一页吗?
  • 我在TabController 中测试了两个ViewControllers。在第二个中,我添加了webView。尝试不使用loadView() 函数,它应该也可以工作。
  • 感谢您提议的编辑顺便说一句。!我也试过了,但是还是不行。如果我摆脱 webView 和 activityIndi​​cator,它只会加载第三页。
  • 就是这样,即使我注释掉所有内容并只将 WebView 和 ActivityIndi​​cator 留在情节提要中,只要我切换到第三页,应用程序就会崩溃。

标签: swift xcode wkwebview


【解决方案1】:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[WKWebView 视图]:无法识别的选择器已发送到实例

您可能知道,这是因为有人正在向您的 Web 视图发送 -view 消息,该视图没有该名称的方法。不过,UIViewController 有这样的方法,因此可以很好地猜测,在您的应用程序的某个地方,您的 Web 视图被误认为是视图控制器。我没有在您发布的代码中看到这种情况,而且很难从故事板的图像中看出任何事情。

找到问题的方法是查看错误发生时的堆栈跟踪。找到抛出异常的线程,然后在堆栈中查找调用-view 的线程。这应该向您显示正在调用的方法。如果调用不在您的代码中,请查看所涉及的类......您至少应该能够获得一些关于什么类型的对象正在调用 -view 的线索,并且您可以查看您的代码配置该对象的地方。

【讨论】:

  • 这是我能找到的:*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x100d0ebf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key activityIndicator.' terminating with uncaught exception of type NSException
  • 这是一个不同的错误。可能是相同的根本原因,但这是一个不同的例外。您需要在调试器中运行您的应用并为所有异常添加断点,以便在抛出异常时停止执行。
【解决方案2】:

我现在已经完全重新创建了整个应用程序,它现在可以工作了。当我为这三个页面创建 ViewControllers 时,似乎出了点问题。这次我也保留了原来的ViewController。

毕竟这是我用过的代码:ThirdViewController.swift

//
//  ThirdViewController.swift
//  SmartMirror
//

import UIKit
import WebKit

class ThirdViewController: UIViewController, WKUIDelegate {
    
    @IBOutlet var webView: WKWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let url = URL(string: "http://192.168.178.34:8080/")
        let request = URLRequest(url: url!)
        webView.load(request)
    }
    
}

感谢所有帮助过我的人!

【讨论】:

  • 您可以将自己的答案标记为正确答案。
猜你喜欢
  • 1970-01-01
  • 2018-07-02
  • 2018-07-12
  • 2016-09-01
  • 2018-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多