为啥是UIActivityIndicatorView!展开时为零?
Posted
技术标签:
【中文标题】为啥是UIActivityIndicatorView!展开时为零?【英文标题】:Why is UIActivityIndicatorView! nil when unwrapped?为什么是UIActivityIndicatorView!展开时为零? 【发布时间】:2017-10-06 15:10:40 【问题描述】:我正在使用 xcode 9/swift 4。我有一个简单的 UIViewController 和 WKWebView 作为插座。
class WebViewController: UIViewController, WKUIDelegate, WKNavigationDelegate
@IBOutlet weak var webView: WKWebView!
var spinner:UIActivityIndicatorView!
override func loadView()
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.navigationDelegate = self
webView.uiDelegate = self
view = webView
override func viewDidLoad()
super.viewDidLoad()
spinner = UIActivityIndicatorView()
webView.addSubview(spinner)
spinner.center = self.webView.center
spinner.hidesWhenStopped = true
spinner.isHidden = true
首先,我尝试将 UIActivityViewIndicator 从情节提要中拖出作为插座,但每当我尝试做任何事情时,它总是不断出错,例如。 spinner.hidesWhenStopped 表示展开时为 nil。
然后我尝试以编程方式创建微调器,但也无法显示。我猜我犯了一个错误,认为我可以在 webView 上添加微调器,例如。 webView.addSubview(spinner)。
谢谢。
【问题讨论】:
【参考方案1】:您有一个作为插座的 webView,但您也在 loadView
中创建它。如果它是您在 Storyboard 中创建的内容的出口,那么您不应该这样做。
您创建的 webView 的框架为 .zero。在 viewDidLoad,它可能仍然是 .zero(检查)——在这种情况下,微调器位于 0,0。
您可以将微调器设为出口。只知道它只能在 viewDidLoad 或之后而不是在 loadView 中可用(使用 Storyboard 时通常不会覆盖它)。如果您在该代码中进行了操作,那么您已经停止加载情节提要。你可以打电话给super.loadView()
,但我什至不会覆盖。
这就是我会做的:
-
摆脱你的
loadView
。
使 webView 成为 self.view 的普通子级 - 不要尝试为其设置视图。
将微调器添加为出口
只能在 viewDidLoad 或更高版本中访问微调器
使用自动布局来定位和调整所有内容(不要只设置中心)
(或者如果您真的设置了 loadView 并将 view 设置为 webView)
-
摆脱情节提要并以编程方式完成所有操作
当您知道 webView 有大小时设置微调器的位置(使用自动布局让这一切自动发生)。
【讨论】:
以上是关于为啥是UIActivityIndicatorView!展开时为零?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 UIActivityIndicator 在 UIButton 中以负 x 坐标作为子视图
UIActivityIndicatorView 正确使用
处理 UIActivityIndicator 和多线程的最佳方法是啥?
UIActivityIndicatorView 不工作(获取影响 UIActivityIndicatorView 的 Facebook 权限)