在覆盖 segue 之前,如何将位置捕获器获取到 运行?
How do you get a location capturer to run before an override segue?
因此,我需要在用户到达主页之前捕获用户的位置(当然要征得他们的同意)。因此,在 login/register 页面上,我想捕获该位置,但我需要在为已登录用户覆盖转至主页之前执行此操作。你们有什么想法吗?下面是覆盖转场。
我在覆盖函数中将位置捕获器放在 segue 之前,但它仍然在用户有机会接受共享位置之前转到主页。这并不是真的出乎意料,因为根据定义,整个覆盖函数都是一个覆盖函数
override func viewDidAppear(_ animated: Bool) {
//////////////////////
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let databaseRef = Database.database().reference()
guard let uid = Auth.auth().currentUser?.uid else { return }
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
latestLocation = ["latitude" : locValue.latitude, "longitude" : locValue.longitude]
let lat = locValue.latitude
let lon = locValue.longitude
dict = CLLocation(latitude: lat, longitude: lon)
print("dict", dict)
if let locationDictionary = latestLocation {
databaseRef.child("people").child(uid).child("Coordinates").setValue(locationDictionary)
}
}
//////////////////////
if Auth.auth().currentUser != nil {
self.performSegue(withIdentifier: "tohome", sender: nil)
}
}
更新:这是我登录和注册的方式。
@IBAction func RegisterPressed(_ sender: Any) {
Auth.auth().createUser(withEmail: (emailField.text ?? ""), password: (passwordField.text ?? "")) { (user, error) in
if let _eror = error {
//something bad happning
print(_eror.localizedDescription )
let alert = UIAlertController(title: "Error", message: "Invalid Entry or Duplicate.", preferredStyle: UIAlertController.Style.alert)
let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}else{
//user registered successfully
print(user as Any)
if let userID = user?.user.uid
{
KeychainWrapper.standard.set((userID), forKey: "uid")
let databaseRef = Database.database().reference()
databaseRef.child("A1").child(userID).child("users").setValue(self.emailField.text!)
databaseRef.child("people").child(userID).child("postID").setValue(userID)
let components = self.emailField.text!.split(separator: "@")
let child1 = components[0] //will be jake
let child2 = components[1] //will be aol.com
print(components, child1, child2, "childs")
databaseRef.child("people").child(userID).child("e2").setValue(child2)
components.forEach { print([=12=]) }
self.performSegue(withIdentifier: "tohome", sender: nil)
}
}
}
}
@IBAction func loginInPressed(_ sender: Any) {
Auth.auth().signIn(withEmail: (emailField.text ?? ""), password: (passwordField.text ?? "")) { (user, error) in
if let _eror = error {
//something bad happning
print(_eror.localizedDescription )
let alert = UIAlertController(title: "Error", message: "Incorrect Email or Password.", preferredStyle: UIAlertController.Style.alert)
let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}else{
//user registered successfully
print(user as Any)
if let userID = user?.user.uid
{
KeychainWrapper.standard.set((userID), forKey: "uid")
self.performSegue(withIdentifier: "tohome", sender: nil) }
}
}
}
如果我在 viewDidAppear(_:)
中理解正确的话,你有一个条件。如果是 true
你立即尝试执行 segue。
if Auth.auth().currentUser != nil {
self.performSegue(withIdentifier: "tohome", sender: nil)
}
由于位置必须移动到 HomeScreen
,当您在 CLLocationManagerDelegate
中收到第一个位置更新时,为什么不进行导航(segue
)?
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// check for existing location if we received earlier
guard self.latestLoc == nil else {
// we received one location earlier, navigation to Home completed. no need to proceed
// If we no longer need to listen for loc updates, we can stop listening further
manager.stopUpdatingLocation()
return
}
// ... Your exiting data base update code
guard let latestLoc = locations.last else { return }
self.latestLoc = latestLoc // If you want to pass this location to destination view controller in `prepare(for: UIStoryboardSegue, sender: Any?)`
// Also it will good practice to call manager.stopUpdatingLocation() if you need location only for once
// Now move to HomeScreen
self.performSegue(withIdentifier: "tohome", sender: nil)
// If we no longer need to listen for loc updates, we can stop listening further
manager.stopUpdatingLocation()
}
因此,我需要在用户到达主页之前捕获用户的位置(当然要征得他们的同意)。因此,在 login/register 页面上,我想捕获该位置,但我需要在为已登录用户覆盖转至主页之前执行此操作。你们有什么想法吗?下面是覆盖转场。
我在覆盖函数中将位置捕获器放在 segue 之前,但它仍然在用户有机会接受共享位置之前转到主页。这并不是真的出乎意料,因为根据定义,整个覆盖函数都是一个覆盖函数
override func viewDidAppear(_ animated: Bool) {
//////////////////////
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let databaseRef = Database.database().reference()
guard let uid = Auth.auth().currentUser?.uid else { return }
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
latestLocation = ["latitude" : locValue.latitude, "longitude" : locValue.longitude]
let lat = locValue.latitude
let lon = locValue.longitude
dict = CLLocation(latitude: lat, longitude: lon)
print("dict", dict)
if let locationDictionary = latestLocation {
databaseRef.child("people").child(uid).child("Coordinates").setValue(locationDictionary)
}
}
//////////////////////
if Auth.auth().currentUser != nil {
self.performSegue(withIdentifier: "tohome", sender: nil)
}
}
更新:这是我登录和注册的方式。
@IBAction func RegisterPressed(_ sender: Any) {
Auth.auth().createUser(withEmail: (emailField.text ?? ""), password: (passwordField.text ?? "")) { (user, error) in
if let _eror = error {
//something bad happning
print(_eror.localizedDescription )
let alert = UIAlertController(title: "Error", message: "Invalid Entry or Duplicate.", preferredStyle: UIAlertController.Style.alert)
let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}else{
//user registered successfully
print(user as Any)
if let userID = user?.user.uid
{
KeychainWrapper.standard.set((userID), forKey: "uid")
let databaseRef = Database.database().reference()
databaseRef.child("A1").child(userID).child("users").setValue(self.emailField.text!)
databaseRef.child("people").child(userID).child("postID").setValue(userID)
let components = self.emailField.text!.split(separator: "@")
let child1 = components[0] //will be jake
let child2 = components[1] //will be aol.com
print(components, child1, child2, "childs")
databaseRef.child("people").child(userID).child("e2").setValue(child2)
components.forEach { print([=12=]) }
self.performSegue(withIdentifier: "tohome", sender: nil)
}
}
}
}
@IBAction func loginInPressed(_ sender: Any) {
Auth.auth().signIn(withEmail: (emailField.text ?? ""), password: (passwordField.text ?? "")) { (user, error) in
if let _eror = error {
//something bad happning
print(_eror.localizedDescription )
let alert = UIAlertController(title: "Error", message: "Incorrect Email or Password.", preferredStyle: UIAlertController.Style.alert)
let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
alert.addAction(action)
self.present(alert, animated: true, completion: nil)
}else{
//user registered successfully
print(user as Any)
if let userID = user?.user.uid
{
KeychainWrapper.standard.set((userID), forKey: "uid")
self.performSegue(withIdentifier: "tohome", sender: nil) }
}
}
}
如果我在 viewDidAppear(_:)
中理解正确的话,你有一个条件。如果是 true
你立即尝试执行 segue。
if Auth.auth().currentUser != nil {
self.performSegue(withIdentifier: "tohome", sender: nil)
}
由于位置必须移动到 HomeScreen
,当您在 CLLocationManagerDelegate
中收到第一个位置更新时,为什么不进行导航(segue
)?
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// check for existing location if we received earlier
guard self.latestLoc == nil else {
// we received one location earlier, navigation to Home completed. no need to proceed
// If we no longer need to listen for loc updates, we can stop listening further
manager.stopUpdatingLocation()
return
}
// ... Your exiting data base update code
guard let latestLoc = locations.last else { return }
self.latestLoc = latestLoc // If you want to pass this location to destination view controller in `prepare(for: UIStoryboardSegue, sender: Any?)`
// Also it will good practice to call manager.stopUpdatingLocation() if you need location only for once
// Now move to HomeScreen
self.performSegue(withIdentifier: "tohome", sender: nil)
// If we no longer need to listen for loc updates, we can stop listening further
manager.stopUpdatingLocation()
}