为啥是UIActivityIndi​​catorView!展开时为零?

Posted

技术标签:

【中文标题】为啥是UIActivityIndi​​catorView!展开时为零?【英文标题】:Why is UIActivityIndicatorView! nil when unwrapped?为什么是UIActivityIndi​​catorView!展开时为零? 【发布时间】: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 有大小时设置微调器的位置(使用自动布局让这一切自动发生)。

【讨论】:

以上是关于为啥是UIActivityIndi​​catorView!展开时为零?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UIActivityIndi​​cator 在 UIButton 中以负 x 坐标作为子视图

UIActivityIndi​​catorView 正确使用

处理 UIActivityIndi​​cator 和多线程的最佳方法是啥?

UIActivityIndi​​catorView 不工作(获取影响 UIActivityIndi​​catorView 的 Facebook 权限)

很难将 UIActivityIndi​​cator 放置在 UIButton 中

UIActivityIndi​​catorView 不会在正确的时间停止