2017-10-01 3 views
0

Besoin d'aide sur l'exécution de code seulement si mes services de localisation sont activés parce que j'ai une tableview qui prend les données de firebase et les organise par distance et ne veut pas que l'application plante . J'ai aussi un UIRefreshControl que je veux seulement exécuter du code si les services de localisation sont également activés. Ma configuration actuelle ne fait pas ce que je cherche. Je poste tout mon ViewDidLoad ainsi que mon UIRefreshControl. getTableViewData() est le code que je veux exécuter si les services de localisation sont activés. Merci.Swift Exécuter uniquement du code si les services de localisation sont activés

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() 
    locationManager.requestWhenInUseAuthorization() 


    if CLLocationManager.locationServicesEnabled() { 
     switch(CLLocationManager.authorizationStatus()) { 
     case .notDetermined, .restricted, .denied: 
      print("No access") 
     case .authorizedAlways, .authorizedWhenInUse: 
      print("Access") 
      getTableViewData() 
     } 
    } else { 
     print("Location services are not enabled") 
    } 

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


@objc func handleRefresh(refreshControl: UIRefreshControl) { 
    self.usersArray.removeAll() 

    if CLLocationManager.locationServicesEnabled() { 
     switch(CLLocationManager.authorizationStatus()) { 
     case .notDetermined, .restricted, .denied: 
      print("No access") 
     case .authorizedAlways, .authorizedWhenInUse: 
      print("Access") 
      getTableViewData() 
     } 
    } else { 
     print("Location services are not enabled") 
    } 

    self.tableView.reloadData() 
    refreshControl.endRefreshing() 
} 
+0

que se passe-t-il? Qu'est-ce qui ne fonctionne pas? –

+0

Il n'exécute pas "getTableViewData()" lorsque j'autorise l'accès. –

+0

Je ne veux pas que "getTableViewData()" s'exécute si l'accès a été refusé. –

Répondre

0

Vous devriez vérifier la valeur de retour de cette méthode avant de commencer les mises à jour de localisation pour déterminer si l'utilisateur a des services de localisation activée pour le périphérique en cours. Les services de localisation incitent les utilisateurs la première fois qu'ils tentent d'utiliser des informations liées à la position dans une application, mais ne demandent pas de tentatives ultérieures. Si l'utilisateur refuse l'utilisation de services de localisation et que vous tentez de démarrer des mises à jour de localisation de toute façon, le gestionnaire d'emplacement signale une erreur à son délégué.

Le travail consiste à présenter une alerte pour ouvrir les paramètres de l'application pour permettre à l'utilisateur d'activer le service de localisation.

let alert = UIAlertController(title: "", message: "Please Allow the location Service to open this screen.", preferredStyle: UIAlertControllerStyle.alert) 
    alert.addAction(UIAlertAction(title: "Go to Settings", style: UIAlertActionStyle.default, handler: { (alert: UIAlertAction!) in 
     UIApplication.shared.openURL(NSURL(string:UIApplicationOpenSettingsURLString)! as URL) 
    })) 

    UIApplication.shared.keyWindow?.rootViewController?.present(alert, animated: true, completion: nil)