【发布时间】:2020-10-02 06:03:03
【问题描述】:
我最近遇到过几次这样的情况,所以我想我会主动联系以更好地了解我是否做错了什么或 iOS/Xcode 只是很奇怪。
我有一个实用程序类,它只是继承自 NSObject。我的实用程序类包含对 WKWebView 的引用,并且是 webview 的 navigationDelegate。
在我的一生中,我无法让实用程序类响应 navigationDelegate 方法,除非我在设置委托时断点,打印出一些东西(任何东西,来自我的测试)到控制台(是的,这个很重要。仅仅断点是不够的——我必须打印一些东西)。然后重新运行,就正常响应了。
我非常熟悉 iOS 开发和委托模式,但这是我以前见过但从未理解过的行为,所以如果我出错了,我想更好地理解。
这是我正在做的一些示例代码。值得注意的是,如果我将实用程序排除在外,只使用 UIViewControllers 作为 navigationDelegate,一切正常。
class ExampleUtility: NSObject, WKNavigationDelegate {
private weak var containerViewController: UIViewController?
private let webView: WKWebView
init(containerViewController: UIViewController) {
self.containerViewController = containerViewController
webView = WKWebView(frame: containerViewController.view.frame)
super.init()
setupWebView()
}
private func setupWebView() {
webView.navigationDelegate = self
containerViewController?.view.addSubview(webView)
}
func start() {
guard let url = URL(string: urlString) else {
return
}
let request = URLRequest(url: url)
webview.load(request)
}
public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
// This is never called, unless I print ANYTHING to the console
}
}
它在断点和打印后响应的事实让我觉得它是某种错误?同样值得一提的是,这不仅适用于调试运行。当不从 Xcode 运行时也会发生这种情况。
非常感谢任何帮助。
【问题讨论】:
-
谁拥有
ExampleUtility实例?我想知道那个对象是不是发布得太早了。 -
你能说明你如何使用
ExampleUtility吗?即它的调用者? -
好吧,很有趣——就是这样。我在调用站点进行了这样的初始化:
let util = ExampleUtility(containerViewController: self)我没有将它作为属性存储在容器视图控制器中,这是我的错误。你可以看到我会让 containerViewController 变弱这一事实,我的意图是这样做,只是一个疏忽!感谢您为我指明正确的方向!
标签: swift xcode nsobject delegation