Swift:无法在自定义视图上调用removeFromSuperview()

时间:2015-05-22 21:17:37

标签: ios iphone xcode swift ios8

我正在尝试向我的应用添加进度指示器。首先,我创建一个 overlayView 并将其添加到self.navigationController!.view,然后将 SwiftProgressView 添加到 overlayView

这很有效,但问题是我尝试删除** SwiftProgressView ** ...当我在 SwiftProgressView 上调用removeFromSuperview()时,应用程序崩溃并出现以下错误:< / p>

  

致命错误:在解包可选值时意外发现nil

以下是我创建观点的方式(AIView是我创建的自定义视图,其中包含活动指示符):

private var AIView: ActivityIndicatorView?
private var overlayView: UIView?

这就是我尝试删除它们的方式:

    if let xy = AIView {
        xy.removeFromSuperview()
    }

    overlayView?.removeFromSuperview()

我不知道为什么我不能直接在ActivityIndi​​catorView上调用.removeFromSuperview(),而是通过展开可选的ActivityIndi​​catorView?我可以拨打.removeFromSuperview()但我收到错误:

  

致命错误:在解包可选值时意外发现nil

如果有人能够弄清楚这里的问题会有什么帮助。提前谢谢。

--- ---编辑

在未能弄清楚问题是什么之后,我用一个测试类重新创建了相同的场景,而没有上一个的所有铃声和声音:

    class tempTest : NSObject {

    var progressView: SwiftProgressView?
    var overlayView: UIView?

    func go(parentView:UIView) {

        if let ov = createOverlay(parentView.frame) {

            if let pv = createProgressView() {

                ov.addSubview(pv)

                parentView.addSubview(ov)

            } else {
                println("Unable to create OverlayView.")
            }

        } else {
            println("Unable to create OverlayView.")
        }


    }

    func createOverlay(frame:CGRect) -> UIView? {
        // Initializing Overlay view
        overlayView = UIView(frame: frame)

        overlayView?.backgroundColor = UIColor(red: 0.1, green: 0.1, blue: 0.1, alpha: 0.3)

        // Adding tap gesture
        let tapGest = UITapGestureRecognizer(target: self, action: Selector("overlayTapped:"))

        tapGest.numberOfTapsRequired = 1

        overlayView?.addGestureRecognizer(tapGest)

        // Return the created overlay
        return overlayView
    }

    func createProgressView() -> SwiftProgressView? {

        // Create progressView
        progressView = SwiftProgressView()

        // Configure Options
        progressView?.setIndicatorOfType(SwiftProgressIndicatorType.activityIndicator)
        progressView?.setTitleText("Test")
        progressView?.setDetailText("This is a Test")

        // Return progressView
        return progressView
    }

    func overlayTapped(recognizer: UITapGestureRecognizer){

        if var pv = progressView {
            pv.removeFromSuperview()
        }

        if var ov = overlayView {
            ov.removeFromSuperview()
        }

        // This generates the same error
        // progressView!.removeFromSuperview();
        // overlayView!.removeFromSuperview();

    }

}

应用程序在执行此语句时崩溃:

  pv.removeFromSuperview()

如果我评论此代码:

if var pv = progressView {
    pv.removeFromSuperview()
}

然后应用程序不会崩溃,而是会删除叠加层,但是当我尝试再次显示叠加层时,它会在此声明中崩溃:

  overlayView = UIView(frame: frame) 

在createOverlay:method

1 个答案:

答案 0 :(得分:4)

ActivityIndicatorView是类型,而不是对象本身。

你应该这样做:

if let xy = AIView {
        xy.removeFromSuperview()
    }

或者这个:

AIView?.removeFromSuperview()