我有这样的设置:
self.webView = WKWebView(frame: frame, configuration: WKWebViewConfiguration())
self.externView = UIView(frame: frame)
self.externWebView = WKWebView(frame: subFrame, configuration: WKWebViewConfiguration())
let StackView = UIStackView(frame: frame)
self.externView?.addSubview(StackView)
self.externView?.backgroundColor = UIColor.blackColor()
view.addSubview(self.webView!)
self.externView?.hidden = true
StackView.addSubview(self.externWebView!)
view.addSubview(self.externView!)
这创建了我想要的初始设置,这允许 1 个 Web 视图充当主要视图,它可以启动,外部视图可以渲染最初隐藏的其他内容。
我遇到的问题是,从我正在调用的工作线程
WKExteralLoader.externView!.hidden = false;
WKExteralLoader.webView!.hidden = true;
最多可能需要 30 秒才能生效;然而,它的逆几乎是瞬时的。
WKExteralLoader.webView!.hidden = false;
WKExteralLoader.externView!.hidden = true;
有什么想法可能会导致这个问题吗?
Thanks!
@MobileMon 告诉您如何解决问题,但没有告诉您原因。
UIKit 不是线程安全的,这意味着必须从主线程进行所有 UIKit 调用。设置视图的隐藏标志是 UIKit 调用,因此需要从主线程完成。
如果您从后台线程操作 UIView 对象,结果是未定义的。大多数情况下,结果是更改需要很长时间才能生效(您所看到的),但有时更改根本没有发生,有时结果是奇怪的视觉效果,有时您的应用程序会碰撞。
每当您从后台线程操作 UIView 对象时,您需要将其包装在对dispatch_async(dispatch_get_main_queue())
正如 MobileMon 的回答(或者其他一些导致代码从主线程运行的方法,但这是首选方法。)
Edit:
为了清楚起见,你说:
我遇到的问题是,从我正在调用的工作线程
WKExteralLoader.externView!.hidden = false;
WKExteralLoader.webView!.hidden = true;
您无法从工作线程执行 UI 代码。相反,您需要像这样编写代码:
dispatch_async(dispatch_get_main_queue(), ^{
WKExteralLoader.externView!.hidden = false;
WKExteralLoader.webView!.hidden = true;
});
这样,您就可以从工作线程将 UI 代码分派回主线程。
您可能有其他代码在您不知情的情况下尝试从后台线程执行 UIKit 调用。要进行检查,请添加以下行:
print("isMainThread = \(Thread.current.isMainThread)")
然后检查控制台中打印的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)