2017-09-29 6 views
1

J'ai converti en Swift 4. Ma vue de table qui tire les données de la base de données et les organise par distance de l'emplacement des utilisateurs a cessé de fonctionner. Le problème est que l'emplacement de mes utilisateurs continue d'augmenter jusqu'à zéro. J'ai entendu des gens ayant des problèmes avec mapkit récemment à cause de la conversion, mais je ne sais pas si cela tombe dans la même catégorie. Donc la ligne qui dit "let userLocation = CLLocation (latitude: latitude, longitude: longitude!)" Renvoie zéro. Merci.Swift 4 CLLocation Emplacement de l'utilisateur Longitude et Latitude

BreakPoint

override func viewDidLoad() { 
    super.viewDidLoad() 

    searchController.searchResultsUpdater = self 
    searchController.dimsBackgroundDuringPresentation = false 
    definesPresentationContext = true 
    tableView.tableHeaderView = searchController.searchBar 

    locationManager.delegate = self 
    locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.startUpdatingLocation() 
    locationManager.stopUpdatingLocation() 
    locationManager.requestAlwaysAuthorization() 

    getTableViewData() 

    refresher = UIRefreshControl() 
    refresher.attributedTitle = NSAttributedString(string: "Pull to refresh") 
    refresher.addTarget(self, action: #selector(RegisteredLocations.handleRefresh(refreshControl:)), for: UIControlEvents.valueChanged) 
    tableView.addSubview(refresher) 
} 

func getTableViewData() { 
    Database.database().reference().child("Businesses").queryOrdered(byChild: "businessName").observe(.childAdded, with: { (snapshot) in 

     let key = snapshot.key 

     if(key == self.loggedInUser?.uid) { 
      print("Same as logged in user, so don't show!") 
     } else { 
      if let locationValue = snapshot.value as? [String: AnyObject] { 
       let lat = Double(locationValue["businessLatitude"] as! String) 
       let long = Double(locationValue["businessLongitude"] as! String) 
       let businessLocation = CLLocation(latitude: lat!, longitude: long!) 

       let latitude = self.locationManager.location?.coordinate.latitude 
       let longitude = self.locationManager.location?.coordinate.longitude 
       let userLocation = CLLocation(latitude: latitude!, longitude: longitude!) 

       let distanceInMeters: Double = userLocation.distance(from: businessLocation) 
       let distanceInMiles: Double = distanceInMeters * 0.00062137 
       let distanceLabelText = String(format: "%.2f miles away", distanceInMiles) 

       var singleChildDictionary = locationValue 
       singleChildDictionary["distanceLabelText"] = distanceLabelText as AnyObject 
       singleChildDictionary["distanceInMiles"] = distanceInMiles as AnyObject 
       self.usersArray.append(singleChildDictionary as NSDictionary) 
       self.usersArray = self.usersArray.sorted { 
        !($0?["distanceInMiles"] as! Double > $1?["distanceInMiles"] as! Double) 
       } 

      } 
      //insert the rows 
      //self.followUsersTableView.insertRows(at: [IndexPath(row:self.usersArray.count-1,section:0)], with: UITableViewRowAnimation.automatic) 
      self.followUsersTableView.reloadData() 
     } 

    }) { (error) in 
     print(error.localizedDescription) 
    } 

} 
+0

Qu'est-ce que ces lignes de retour: laisser la latitude = self.locationManager.location .coordinate.latitude laisser la longitude = self.locationManager.location .coordinate.longitude – azamsharp

+0

Je viens d'ajouter une capture d'écran d'un point d'arrêt et long et lat? de l'emplacement de l'utilisateur effectivement retourné –

+0

Merci! Vos valeurs de latitude et de longitude semblent très étranges. Lorsque l'application a fonctionné pour la première fois, elle a demandé la permission d'utiliser l'emplacement. – azamsharp

Répondre

3

Vous appelez locationManager.stopUpdatingLocation() immédiatement après l'appel locationManager.startUpdatingLocation().

Cela ne fonctionnera pas car vous avez besoin de laisser le temps pour l'emplacement à déterminer. Vous ne devez pas utiliser l'emplacement avant d'avoir reçu un appel à la méthode de délégation didUpdateLocations.

Si vous ciblez iOS 9 et versions ultérieures et que vous n'avez besoin que d'un seul emplacement, vous devez appeler le requestLocation() au lieu de startUpdatingLocation(), mais vous devez toujours attendre le rappel de la méthode de délégation.

Une fois que vous avez reçu un emplacement, vous pouvez charger vos données de table.

+0

Il me manquait certains paramètres de confidentialité dans l'info.plist. –