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

时间:2019-11-18 08:24:47

标签: ios swift uiwindow

我已将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”

此屏幕截图随附于此:

error screenshot

该如何纠正?

2 个答案:

答案 0 :(得分:0)

您已经用window!.makeKeyAndVisible()对其进行了包装。 因此,您可以在这里-> window!.viewWithTag(1234)

还将建议阅读https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html。您需要获得基本思路,才能知道力解开意味着什么以及何时可以安全使用。

答案 1 :(得分:0)

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

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

        }
    }