错误消息:其视图不在窗口层次结构中 - Swift

时间:2016-08-21 18:55:18

标签: ios swift view

当我想要呈现新视图时,我收到了错误消息。这是我的代码。我收到此错误:警告:尝试显示其视图不在窗口层次结构中!

它显示了新视图(LoginController),一切正常。但为什么我得到这些错误,我该如何解决?

的ViewController:

import UIKit
import MapKit
import Firebase
import SwiftyJSON

class FriendsController: UICollectionViewController, UICollectionViewDelegateFlowLayout, CLLocationManagerDelegate, MKMapViewDelegate {

var window: UIWindow?
var mapView: MKMapView?
let locationManager = CLLocationManager()

let distanceSpan: Double = 500


private let cellId = "cellId"


override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.title = "Current Location"

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Logout", style: .Plain, target: self, action: #selector(handleLogout))

    // user is not logged in
    if FIRAuth.auth()?.currentUser?.uid == nil {
        performSelector(#selector(handleLogout), withObject: nil, afterDelay: 0)
    }

    collectionView?.backgroundColor = UIColor.redColor()

    collectionView?.backgroundColor = UIColor.whiteColor()
    collectionView?.alwaysBounceVertical = true

    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.view.backgroundColor = UIColor.whiteColor()

    self.mapView = MKMapView(frame: CGRectMake(0, 20, (self.window?.frame.width)!, (self.window?.frame.height)!))
    self.view.addSubview(self.mapView!)

    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()
    self.mapView!.showsUserLocation = true

    checkIfUserLoggedIn()

}

func checkIfUserLoggedIn() {
    if FIRAuth.auth()?.currentUser?.uid == nil {
        performSelector(#selector(handleLogout), withObject: nil, afterDelay: 0)
        handleLogout()

    }

}

func handleLogout() {

    do {
        try FIRAuth.auth()?.signOut()
    } catch let logoutError {
        print(logoutError)
    }

    let loginController = LoginController()
    presentViewController(loginController, animated: true, completion: nil) 

}

func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) {
    if let mapView = self.mapView {
        let region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, self.distanceSpan, self.distanceSpan)
        mapView.setRegion(region, animated: true)
        mapView.showsUserLocation = true
    }
}

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
    let location = locations.last

    let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)

    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))

    self.mapView!.setRegion(region, animated: true)

//        let anotation = MKPointAnnotation()
//        anotation.coordinate = center
//        anotation.title = "The Location"
//        anotation.subtitle = "This is the location!"
//        mapView!.addAnnotation(anotation)

    self.locationManager.stopUpdatingLocation()


}


func locationManager(manager: CLLocationManager, didFailWithError error: NSError)
{
    print("Errors: " + error.localizedDescription)
}




}

LoginController:

    import UIKit
import Firebase

class LoginController: UIViewController {

    let inputsContainerView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.whiteColor()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.layer.cornerRadius = 5
        view.layer.masksToBounds = true
        return view

}()

lazy var loginRegisterButton: UIButton = {
    let button = UIButton(type: .System)
    button.backgroundColor = UIColor(r: 80, g: 101, b: 161)
    button.setTitle("Register", forState: .Normal)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.setTitleColor(UIColor.whiteColor(), forState: .Normal)
    button.titleLabel?.font = UIFont.boldSystemFontOfSize(16)

    button.addTarget(self, action: #selector(handleLoginRegister), forControlEvents: .TouchUpInside)

    return button
}()

func handleLoginRegister() {
    if loginRegisterSegmentedControl.selectedSegmentIndex == 0 {
        handleLogin()
    } else {
        handleRegister()
    }
}

func handleLogin() {
    guard let email = emailTextField.text, password = passwordTextField.text else {
        print("Form is not valid")
        return
    }

    FIRAuth.auth()?.signInWithEmail(email, password: password, completion: { (user, error) in

        if error != nil {
            print(error)
            return
        }

        self.dismissViewControllerAnimated(true, completion: nil)

    })


}



func handleRegister() {
    guard let email = emailTextField.text, password = passwordTextField.text, name = nameTextField.text else {
        print("Form is not valid")
        return
    }

    FIRAuth.auth()?.createUserWithEmail(email, password: password, completion: { (user: FIRUser?, error) in

        if error != nil {
            print(error)
            return
        }

        guard let uid = user?.uid else {
            return
        }

        //successfully autheticated user
        let ref = FIRDatabase.database().referenceFromURL("https://placetaggertabbarmenu.firebaseio.com")
        let usersReference = ref.child("users").child(uid)
        let values = ["name": name, "email": email]
        usersReference.updateChildValues(values, withCompletionBlock: { (err, ref) in

            if error != nil {
                print(err)
                return
            }

            self.dismissViewControllerAnimated(true, completion: nil)

        })

    })

}



let nameTextField: UITextField = {
    let tf = UITextField()
    tf.placeholder = "Name"
    tf.translatesAutoresizingMaskIntoConstraints = false
    return tf
}()

let nameSeparatorView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor(r: 220, g: 220, b: 220)
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

let emailTextField: UITextField = {
    let tf = UITextField()
    tf.placeholder = "Email"
    tf.translatesAutoresizingMaskIntoConstraints = false
    return tf
}()

let emailSeparatorView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor(r: 220, g: 220, b: 220)
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

let passwordTextField: UITextField = {
    let tf = UITextField()
    tf.placeholder = "Password"
    tf.translatesAutoresizingMaskIntoConstraints = false
    tf.secureTextEntry = true
    return tf

}()

lazy var loginRegisterSegmentedControl: UISegmentedControl = {
    let sc = UISegmentedControl(items: ["Login", "Register"])
    sc.translatesAutoresizingMaskIntoConstraints = false
    sc.tintColor = UIColor.whiteColor()
    sc.selectedSegmentIndex = 1
    sc.addTarget(self, action: #selector(handleLoginRegisterChange), forControlEvents: .ValueChanged)
    return sc
}()

lazy var profileImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.image = UIImage(named: "Facebook Profile Pic")
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.contentMode = .ScaleAspectFill

    imageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
    imageView.userInteractionEnabled = true


    return imageView

}()

func handleLoginRegisterChange() {
    let title = loginRegisterSegmentedControl.titleForSegmentAtIndex(loginRegisterSegmentedControl.selectedSegmentIndex)
    loginRegisterButton.setTitle(title, forState: .Normal)

    // change height of inputContainerView
    inputsContainerViewHeigtAnchor?.constant = loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 100 : 150

    // change heigt of nameTextField
    nameTextFieldHeightAnchor?.active = false
    nameTextFieldHeightAnchor = nameTextField.heightAnchor.constraintEqualToAnchor(inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 0 : 1/3)
    nameTextFieldHeightAnchor?.active = true

    emailTextFieldHeightAnchor?.active = false
    emailTextFieldHeightAnchor = emailTextField.heightAnchor.constraintEqualToAnchor(inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 1/2 : 1/3)
    emailTextFieldHeightAnchor?.active = true

    passwordTextFieldHeightAnchor?.active = false
    passwordTextFieldHeightAnchor = passwordTextField.heightAnchor.constraintEqualToAnchor(inputsContainerView.heightAnchor, multiplier: loginRegisterSegmentedControl.selectedSegmentIndex == 0 ? 1/2 : 1/3)
    passwordTextFieldHeightAnchor?.active = true



}



override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = UIColor(r: 61, g: 91, b: 151)

    view.addSubview(inputsContainerView)
    view.addSubview(loginRegisterButton)
    view.addSubview(profileImageView)
    view.addSubview(loginRegisterSegmentedControl)


    setupInputsContainerView()
    setupLoginRegisterButton()
    setupProfileImageView()
    setupLoginRegisterSegmentedControl()

}

func setupProfileImageView() {
    //need x, y, width, height constraints
    profileImageView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
    profileImageView.bottomAnchor.constraintEqualToAnchor(inputsContainerView.topAnchor, constant: -60).active = true
    profileImageView.widthAnchor.constraintEqualToConstant(150).active = true
    profileImageView.heightAnchor.constraintEqualToConstant(150).active = true
}

func setupLoginRegisterSegmentedControl() {

    //need x, y, widht, heigt constraints
    loginRegisterSegmentedControl.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
    loginRegisterSegmentedControl.bottomAnchor.constraintEqualToAnchor(inputsContainerView.topAnchor, constant: -12).active = true
    loginRegisterSegmentedControl.widthAnchor.constraintEqualToAnchor(inputsContainerView.widthAnchor).active = true
    loginRegisterSegmentedControl.heightAnchor.constraintEqualToConstant(30).active = true


}

var inputsContainerViewHeigtAnchor: NSLayoutConstraint?
var nameTextFieldHeightAnchor: NSLayoutConstraint?
var emailTextFieldHeightAnchor: NSLayoutConstraint?
var passwordTextFieldHeightAnchor: NSLayoutConstraint?

func setupInputsContainerView() {

    //need x, y, widht, heigt constraints
    inputsContainerView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
    inputsContainerView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true
    inputsContainerView.widthAnchor.constraintEqualToAnchor(view.widthAnchor, constant: -24).active = true
    inputsContainerViewHeigtAnchor = inputsContainerView.heightAnchor.constraintEqualToConstant(150)
    inputsContainerViewHeigtAnchor?.active = true

    inputsContainerView.addSubview(nameTextField)
    inputsContainerView.addSubview(nameSeparatorView)
    inputsContainerView.addSubview(emailTextField)
    inputsContainerView.addSubview(emailSeparatorView)
    inputsContainerView.addSubview(passwordTextField)


    //need x, y, widht, heigt constraints
    nameTextField.leftAnchor.constraintEqualToAnchor(inputsContainerView.leftAnchor, constant: 12).active = true
    nameTextField.topAnchor.constraintEqualToAnchor(inputsContainerView.topAnchor).active = true
    nameTextField.widthAnchor.constraintEqualToAnchor(inputsContainerView.widthAnchor).active = true
    nameTextFieldHeightAnchor =  nameTextField.heightAnchor.constraintEqualToAnchor(inputsContainerView.heightAnchor, multiplier: 1/3)
    nameTextFieldHeightAnchor?.active = true

    //need x, y, widht, heigt constraints
    nameSeparatorView.leftAnchor.constraintEqualToAnchor(inputsContainerView.leftAnchor).active = true
    nameSeparatorView.topAnchor.constraintEqualToAnchor(nameTextField.bottomAnchor).active = true
    nameSeparatorView.widthAnchor.constraintEqualToAnchor(inputsContainerView.widthAnchor).active = true
    nameSeparatorView.heightAnchor.constraintEqualToConstant(1).active = true

    //need x, y, widht, heigt constraints
    emailTextField.leftAnchor.constraintEqualToAnchor(inputsContainerView.leftAnchor, constant: 12).active = true
    emailTextField.topAnchor.constraintEqualToAnchor(nameTextField.bottomAnchor).active = true
    emailTextField.widthAnchor.constraintEqualToAnchor(inputsContainerView.widthAnchor).active = true
    emailTextFieldHeightAnchor = emailTextField.heightAnchor.constraintEqualToAnchor(inputsContainerView.heightAnchor, multiplier: 1/3)
    emailTextFieldHeightAnchor?.active = true

    //need x, y, widht, heigt constraints
    emailSeparatorView.leftAnchor.constraintEqualToAnchor(inputsContainerView.leftAnchor).active = true
    emailSeparatorView.topAnchor.constraintEqualToAnchor(emailTextField.bottomAnchor).active = true
    emailSeparatorView.widthAnchor.constraintEqualToAnchor(inputsContainerView.widthAnchor).active = true
    emailSeparatorView.heightAnchor.constraintEqualToConstant(1).active = true

    //need x, y, widht, heigt constraints
    passwordTextField.leftAnchor.constraintEqualToAnchor(inputsContainerView.leftAnchor, constant: 12).active = true
    passwordTextField.topAnchor.constraintEqualToAnchor(emailTextField.bottomAnchor).active = true
    passwordTextField.widthAnchor.constraintEqualToAnchor(inputsContainerView.widthAnchor).active = true
    passwordTextFieldHeightAnchor = passwordTextField.heightAnchor.constraintEqualToAnchor(inputsContainerView.heightAnchor, multiplier: 1/3)
    passwordTextFieldHeightAnchor?.active = true



}

func setupLoginRegisterButton() {
    //need x, y, widht, heigt constraints

    loginRegisterButton.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
    loginRegisterButton.topAnchor.constraintEqualToAnchor(inputsContainerView.bottomAnchor, constant: 12).active = true
    loginRegisterButton.widthAnchor.constraintEqualToAnchor(inputsContainerView.widthAnchor).active = true
    loginRegisterButton.heightAnchor.constraintEqualToConstant(40).active = true

}

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}

}

extension UIColor {

convenience init(r: CGFloat, g: CGFloat, b: CGFloat) {
    self.init(red: r/255, green: g/255, blue: b/255, alpha: 1 )
}
}

1 个答案:

答案 0 :(得分:0)

加载视图时,视图可能不在视图层次结构中。尝试将调用移至viewDidAppear。你也打电话给我两次:

 if FIRAuth.auth()?.currentUser?.uid == nil {
    performSelector(#selector(handleLogout), withObject: nil, afterDelay: 0)
} 

所以删除其中一个。