小白在iOS 开发中遇到的一个小坑求教

44 阅读1分钟

日常 iOS 踩坑,在一个容器为 WKWebView 的 UIViewController 中,监听了 webview.title 的值变化,当html 页面加载完成后,title 值会变化,这时需要通过 self.title = webiew.title ,设置到页面导航上。

这时奇怪的坑出现了:

titleObserver = **self**.observe(\.webView.title, options: [], changeHandler: { [**weak** **self**] (vc, _) **in**

            **guard** **let** self = **self**, **let** title = vc.webView.title **else** { **return** }

            NSLog("刷新标题:\(title)")

            self.title = title

        })

self.title = title 居然始终不生效,导航栏标题始终为空,但标题确实打印了,卡在了这个奇怪的地方😅

这么简单的问题,经过各种手段调试:

  • 设置延时2s 加载,可以生效 title(必须 2s,1.5s 就不行),但空白时间太长了,这方案不行。

  • 在 viewDidload 中先设置个 self.title = "abc",后面可以生效,但设置self.title = " ",后面就不生效了,这方案也不行

...

最后通过这样设置居然生效可以了:

            titleObserver = self.observe(\.webView.title, options: [], changeHandler: { [weak self] (vc, _) in
            guard let self = self, let title = vc.webView.title else { return }
            NSLog("刷新标题:\(title)")
            self.title = title
            self.navigationController?.navigationBar.setNeedsLayout()
            self.navigationController?.navigationBar.layoutIfNeeded()
        })

(这方法还是我想出来的,AI 老师在这里根本没有给到有效回答)

有 iOS 专业大佬能解答下这是为啥吗?为啥先设置了一个默认不为空白且不为空的标题后就能生效,为啥必须延时 2s 也能生效,为啥这里需要强制刷新 view 呢❓