【问题标题】:Value of optional type 'UIWindow?' must be unwrapped to refer to member 'viewWithTag' of wrapped base type 'UIWindow'可选类型“UIWindow?”的值必须解包以引用已包装基类型“UIWindow”的成员“viewWithTag”
【发布时间】:2020-03-13 13:56:19
【问题描述】:

我已将一个 Objective-C 文件转换为 Swift,现在转换为:

if isCaptured {
    let colourView = UIView(frame: window.frame)
    colourView?.backgroundColor = UIColor.black
    colourView?.tag = 1234
    colourView?.alpha = 0

    window!.makeKeyAndVisible()
    window.addSubview(colourView)

    // fade in the view
    UIView.animate(withDuration: 0.5, animations: {
        colourView?.alpha = 1
    })
} else {
    // grab a reference to our coloured view
    let colourView = window.viewWithTag(1234)

    // fade away colour view from main view
    UIView.animate(withDuration: 0.5, animations: {
        colourView?.alpha = 0
    }) { finished in
        // remove when finished fading
        colourView?.removeFromSuperview()
    }
}

但我收到以下错误:

可选类型 'UIWindow?' 的值必须解包以引用已封装基类型“UIWindow”的成员“viewWithTag”

特此附上截图:

如何解决这个问题?

【问题讨论】:

    标签: ios swift uiwindow


    【解决方案1】:

    您已经用window!.makeKeyAndVisible() 解开了它。 所以,你可以在这里做同样的事情 -> window!.viewWithTag(1234)

    还建议阅读https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html。您需要了解基本概念,以了解强制展开意味着什么以及何时可以安全使用。

    【讨论】:

      【解决方案2】:

      如果您的问题与窗口有关,那么您还需要从 UIApplication 获取它,您需要解开窗口变量,使用 if-letguard-let 或在执行 viewWithTag() 之前强制解包。

      if let delegate = (UIApplication.shared.delegate as? AppDelegate), let window = delegate.window {
              if let view123 = window.viewWithTag(123) {
      
              }
          }
      

      【讨论】:

      • 因为该窗口已在 if 中展开,您可以在 if 内的任何位置使用该窗口变量,因为 if-statement 窗口不是 nil
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多