I created a unique ID with firebase using childByAutoID. I am able to print this ID from within the reference function used to create it, but when I assign the value to a class variable and print it in the console it comes out nil.
I am trying to send this data to another view controller using the override func prepareForSegue method. It works when the data is a string but it does not work when it is the variable holding the uniqueIDKey.
Here is the code:
class MainViewController: UIViewController, CLLocationManagerDelegate{
var ref: FIRDatabaseReference!
var refHandle: UInt!
let locationManager = CLLocationManager()
let regionRadius: CLLocationDistance = 1000
var currentLocation: CLLocation!
var location: CLLocationCoordinate2D!
var latitude: Double!
var longitude: Double!
let geoCoder = CLGeocoder()
var placemark: CLPlacemark?
let date = NSDate()
var currentOrderIDKey = ""
@IBOutlet weak var mapView: MKMapView!
@IBOutlet weak var userEmailLabel: UILabel!
@IBOutlet weak var pickUpAddress: UITextField!
@IBOutlet weak var deliveryAddress: UITextField!
override func viewDidLoad() {
ref = FIRDatabase.database().reference()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.requestLocation()
locationManager.startUpdatingLocation()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
refHandle = ref.observeEventType(FIRDataEventType.Value, withBlock: { (snapshot) in
let dataDict = snapshot.value as! [String: AnyObject]
print((dataDict))
})
let userID: String = FIRAuth.auth()!.currentUser!.uid
ref.child("users").child(userID).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
let userEmail = snapshot.value!["email"] as! String
self.userEmailLabel.text = userEmail
})
super.viewDidLoad()
print("\(currentLocation)")
}
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
print("didFailWithError \(error)")
if error.code == CLError.LocationUnknown.rawValue {
return
}
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
currentLocation = locations.last!
latitude = currentLocation.coordinate.latitude
longitude = currentLocation.coordinate.longitude
location = CLLocationCoordinate2DMake(latitude, longitude)
print("didUpdateLocations \(currentLocation.coordinate)")
if currentLocation.timestamp.timeIntervalSinceNow < -10 {
return
}
let coordinateRegion = MKCoordinateRegionMakeWithDistance(location, regionRadius * 2.0, regionRadius * 2.0)
mapView.setRegion(coordinateRegion, animated: false)
}
@IBAction func requestPickUpButton(sender: AnyObject) {
ref = FIRDatabase.database().reference()
let userID: String = FIRAuth.auth()!.currentUser!.uid
ref.child("users").child(userID).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
let orderRef = self.ref.child("users").child(userID).child("orders")
let origin = self.pickUpAddress.text!
let destination = self.deliveryAddress.text!
let orderID = orderRef.childByAutoId()
let formatter = NSDateFormatter();
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ";
let defaultTimeZoneStr = formatter.stringFromDate(self.date)
let order = ["date": defaultTimeZoneStr, "origin": origin, "destination": destination]
orderID.setValue(order)
self.currentOrderIDKey = orderID.key as String
print(self.currentOrderIDKey) ///This works!
self.performSegueWithIdentifier("ServiceConfirmation", sender: self)
self.locationManager.stopUpdatingLocation()
})
print(currentOrderIDKey) //this doesnt
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ServiceConfirmation" {
let destinationConroller = segue.destinationViewController as! UINavigationController
let targetController = destinationConroller.topViewController as! ServiceConfirmationViewController
targetController.currentOrderIDKey = "this works"
//this does not : targetController.currentOrderIDKey = currentOrderIDKey
}
}
@IBAction func signOutButton(sender: AnyObject) {
try! FIRAuth.auth()!.signOut()
if let storyboard = self.storyboard {
let viewController = storyboard.instantiateViewControllerWithIdentifier("LoginViewController")
self.presentViewController(viewController, animated: false, completion: nil)
}
}
}
As a bonus question, I get this warning in the console every time I run the app:
<UILayoutContainerView: ...; frame = (0 0; 414 736); autoresize = W+H; gestureRecognizers = <NSArray: ....>; layer = <CALayer: ....>>'s window is not equal to <UINavigationController: ....>'s view's window!
Thanks in advance!