If you do not explain more clearly the set up, it is nearly impossible to help.
the button in this project has nothing to do with the label
But you say you have an error message when button is tapped. Which button is it ?
error message in AppDelegate says,"Thread 1: "-[Project.ViewController buttonTapped:]: unrecognized selector sent to instance 0x133e08da0""
When does the location update ? When user moves ? On simulator or on device ?
How much distance does it move ? If less than a few meters, that may not be enough to detect.
Could you instrument the code with some print statements (lines 32, 70, 73)
And tell exactly what you get.
1. import MapKit
2. import UIKit
3. import CoreLocation
4. import UserNotifications
5.
6. class ViewController: UIViewController, CLLocationManagerDelegate {
7.
8. @IBOutlet var mapView: MKMapView!
9. @IBOutlet private weak var positionLabel : UILabel! // <<< add this and connect to the label in IB
10.
11. let manager = CLLocationManager()
12.
13. override func viewDidLoad() {
14.
15. super.viewDidLoad()
16.
17. // Do any additional setup after loading the view.
18.
19. }
20.
21. override func viewDidAppear(_ animated: Bool) {
22.
23. super.viewDidAppear(animated)
24.
25. manager.desiredAccuracy = kCLLocationAccuracyBest // This should better be done in viewDidLoad
26. manager.delegate = self // This should better be done in viewDidLoad
27. manager.requestWhenInUseAuthorization()
28. manager.startUpdatingLocation()
29. }
30.
31. func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
32. print(#function, "didUpdateLocations") // To see if this is called
33. if let location = locations.first{
34. manager.stopUpdatingLocation()
35. render(location)
36. }
37.
38. func userDistance(from point: MKPointAnnotation) -> Double? { // >>> I took it outside for better readability
39.
40. guard let userLocation = mapView.userLocation.location else {
41. return nil // User location unknown!
42. }
43.
44. let pointLocation = CLLocation(
45. latitude: point.coordinate.latitude,
46. longitude: point.coordinate.longitude
47. )
48.
49. let value = userLocation.distance(from: pointLocation) // replace var by let, as never changed
50. return value
51. }
52.
53.
54. func render(_ location: CLLocation){
55.
56. let coordinate = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
57. let span = MKCoordinateSpan (latitudeDelta: 0.1, longitudeDelta: 0.1)
58. let region = MKCoordinateRegion(center: coordinate, span: span)
59. mapView.setRegion(region, animated: true)
60.
61. mapView.showsUserLocation = true
62.
63. let pin = MKPointAnnotation()
64.
65. pin.coordinate = coordinate
66. pin.title = "your home"
67. pin.subtitle = "Location"
68.
69. mapView.addAnnotation(pin)
70. print(#function, "userDistance(from: pin) ", userDistance(from: pin) )
71. if let distance = userDistance(from: pin) { // >>> I call it here
72. positionLabel.text = String(distance)
73. print(#function, "distance", String(distance))
74. }
75. }
76. }