ios - 调用 removeFromSuperView() 后,SubView(nib) 不会删除

标签 ios swift xcode

我有一个覆盖 View 来隔离内容,我在 viewWillAppear() 中检查身份验证,并且我有一个订阅了我的 Auth 方法的通知。如果我在我的任何其他 View 出现之前进行身份验证,则叠加层不会显示,但它会在第一个 View 中显示,并且即使在调用 removeFromSuperView() 之后也不会消失。

import UIKit
import FirebaseAuth

class ProtectedViewController: UIViewController, ForceSignInBannerDelegate, 
SignUpViewControllerDelegate, LoginViewControllerDelegate{


override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(true)
     NotificationCenter.default.addObserver(self, selector: #selector(checkAuthentication), name: .myNotification, object: nil)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
     self.checkAuthentication()

}

func checkAuthentication() {
    let bannerViewController = ForceSignInBanner.instanceFromNib() as! ForceSignInBanner
    bannerViewController.delegate = self

        if (!AuthenticationService.sharedInstance.isAuthenticated()) {
            self.setView(view: bannerViewController, hidden: false)
            print("Need to login")
        } else if(AuthenticationService.sharedInstance.isAuthenticated()) {
            self.setView(view: bannerViewController, hidden: true)
        }
    }

func setView(view: UIView, hidden: Bool) {
    UIView.transition(with: view, duration: 0.5, options: .transitionCrossDissolve, animations: { _ in

        view.isHidden = hidden
        if hidden {
            view.removeFromSuperview()
        } else {
            self.view.addSubview(view)
        }

    }, completion: nil)
}

最佳答案

这是因为您每次都试图删除一个新的 ForceSignInBanner。理想情况下,您应该创建一次并保留对创建的 ForceSignInBanner 的引用(作为 ProtectedViewController 的可选属性)。

然后删除您存储在属性中的 ForceSignInBanner

    class ProtectedViewController: UIViewController, ForceSignInBannerDelegate {

        // This lazily loads the view when the property is first used and sets the delegate.
        // Ideally you wouldn't force-case the `as` but I've left it for simplicity here.

        private lazy var forceSignInBannerView: ForceSignInBanner = {
            let forceSignInBannerView  = ForceSignInBanner.instanceFromNib() as! ForceSignInBanner
            forceSignInBannerView.delegate = self
            return forceSignInBannerView
        }()

        // ... your other code ... //

        fun toggleForceSignInBannerViewVisibility(isVisible: Bool) {
            if isVisible {
                view.addSubview(forceSignInBannerView)
            } else {
                forceSignInBannerView.removeFromSuperview()
            }
        }

    }

关于ios - 调用 removeFromSuperView() 后,SubView(nib) 不会删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45698868/

相关文章:

ios - 如何让我的投票系统代码与 Parse 一起使用?

swift - AWS Pool.Signup 不会在 Swift 3 的 block 内执行代码

ios - 如何使segue传递字符串起作用?

xcode - Mac OS X 代码签名和可执行文件验证

ios - Swift Google map 从 json 获取坐标

ios - Metal 着色器中的不同顶点格式

ios - 如何在 Interface Builder 中将 Subview 添加到 UIButton

iOS:在运行时向背景添加噪音

ios - 如何在模拟器上运行的应用程序上将 lldb 作为独立调试器启动?

ios - Xcode 9 GM 种子模拟器屏幕人工制品