【问题标题】: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)。

谢谢。

【问题讨论】:

    标签: ios swift uiactivityindicatorview


    【解决方案1】:
    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 并将 view 设置为 webView)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多