【问题标题】:Swift NSObject class does not reliably respond to delegate method callsSwift NSObject 类不能可靠地响应委托方法调用
【发布时间】: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


【解决方案1】:

请将 ExampleUtility 对象作为属性保留在 containerViewController 中。 然后它将起作用。 您遇到此问题的原因是,Webview 实例是在 ExampleUtility 中创建的,但 Example Utility 的实例已被释放,因为它不是 containerViewController 的属性。 请尝试,它一定会奏效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多