为什么是 UIActivityIndi​​catorView!打开时为零?

Why is UIActivityIndicatorView! nil when unwrapped?

我正在使用 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 表示展开时为零。

然后我尝试以编程方式创建微调器,但也无法显示它。我猜我认为我可以在 webView 例如顶部添加微调器是错误的。 webView.addSubview(旋转器)。

谢谢。

  1. 您有一个作为出口的 webView,但您也在 loadView 中创建它。如果它是您在 Storyboard 中创建的内容的出口,那么您不应该这样做。

  2. 您创建的 webView 的框架为 .zero。在 viewDidLoad 处,它可能仍然是 .zero(检查)——在这种情况下,微调器位于 0,0.

  3. 你可以把微调器变成一个插座。只知道它只能在 viewDidLoad 中或之后可用,而不能在 loadView 中使用(使用 Storyboard 时通常不会覆盖它)。如果您在该代码中执行了操作,那么您已经停止加载故事板。您可以调用 super.loadView(),但我什至不会覆盖。

这就是我要做的:

  1. 摆脱你的loadView
  2. 使 webView 成为 self.view 的普通子视图 -- 不要尝试为其设置视图。
  3. 将旋转器添加为出口
  4. 仅在 viewDidLoad 或更高版本中访问微调器
  5. 使用自动布局来定位和调整所有内容的大小(不要只设置居中)

(或者如果您真的设置了 loadView 并将视图设置为 webView)

  1. 摆脱情节提要并以编程方式完成所有事情
  2. 当您知道 webView 有大小时设置微调器的位置(使用自动布局让这一切自动发生)。