簡體   English   中英

您如何讓位置捕獲器在覆蓋轉場之前運行?

[英]How do you get a location capturer to run before an override segue?

所以,我需要在用戶訪問主頁之前捕獲用戶的位置(當然需要他們的許可)。 因此,在登錄/注冊頁面上,我想捕獲位置,但我需要在覆蓋登錄用戶的主頁之前執行此操作。 你們有什么想法嗎? 下面是覆蓋segue。

我在覆蓋功能中的 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($0) }
                    
                    
                    

                    
                    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您會立即嘗試執行轉場。

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()
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM