removeFromSuperview() not working

I wanted to blur the background when the touch id is asked and once the authorization is successfull, the viewcontroller needs to be visible.But this is not happening.The viewcontroller is still blurred even if authorization is successfull.Can anyone help me on how to solve this?

import UIKit
import LocalAuthentication
class TabBarViewController: UITabBarController {

@IBOutlet weak var noteTabBar: UITabBar!

override func viewDidLoad() {
super.viewDidLoad()
    self.authenticateUser()
    self.tabBar.hidden = false
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(false, forKey: "sendModeToggle")
    userDefaults.setObject("Avenir-Medium", forKey: "font")
     userDefaults.setObject(13, forKey:"fontSize")
            // Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/

// MARK: Touch ID Authentication

func authenticateUser()
{
    let context = LAContext()
    var error: NSError?
    let reasonString = "Authentication is needed to access your app! :)"

    let blurEffect = UIBlurEffect(style: .Light)
    let blurVisualEffectView = UIVisualEffectView(effect: blurEffect)
    blurVisualEffectView.frame = view.bounds
    self.view.addSubview(blurVisualEffectView)

    if context.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error)
    {

        context.evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString, reply: { (success, policyError) -> Void in

            if success
            {
                print("Authentication successful! :) ")
                blurVisualEffectView.removeFromSuperview()

            }
            else
            {
                switch policyError!.code
                {
                case LAError.SystemCancel.rawValue:
                    print("Authentication was cancelled by the system.")
                /*case LAError.UserCancel.rawValue:
                    print("Authentication was cancelled by the user.")
                 */   
                case LAError.UserFallback.rawValue:
                    print("User selected to enter password.")
                    NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                        self.showPasswordAlert()
                        blurVisualEffectView.removeFromSuperview()

                    })
                default:
                    print("Authentication failed! :(")
                    NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                        self.showPasswordAlert()
                        blurVisualEffectView.removeFromSuperview()

                    })
                }
            }

        })

    }
    else
    {
        print(error?.localizedDescription)
        NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
            self.showPasswordAlert()
        })
    }


}

}

Upvotes: 4

Views: 6166

Answers (1)

Yury
Yury

Reputation: 6114

Since you are removing view in closure, you probably not in main thread. Try to dispatch removing code to main thread:

if success {
    print("Authentication successful! :) ")
    dispatch_async(dispatch_get_main_queue()) {
        blurVisualEffectView.removeFromSuperview()
    }
}

Upvotes: 6

Related Questions