日常 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 呢❓