You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift实现附近加油站查询及导航功能问题求助

Fix: Nearby Gas Station Annotations Not Showing Up in MapKit

Let’s break down the issues in your code and fix them one by one to get those gas station annotations showing up:

1. Missing Map View Delegate Connection

Your mapView(_:didAdd:) method (which triggers the populateNearByPlaces() function) never runs because you haven’t set the map view’s delegate to self. Add this line in your viewDidLoad():

override func viewDidLoad() {
    super.viewDidLoad()
    maps.delegate = self // This line is critical to map view delegate methods firing
    checkLocationServices()
}

2. Unsafe Forced Cast in Location Manager Setup

You’re using an unnecessary (and risky) forced cast when assigning the location manager delegate. Since your class already conforms to CLLocationManagerDelegate via the extension, simplify this:

func setupLocationManager(){
    locationManager.delegate = self // Remove `as! CLLocationManagerDelegate`
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
}

3. Nested Authorization Status Method

Your locationManager(_:didChangeAuthorization:) is nested inside locationManager(_:didUpdateLocations:), which means it will never be called by the system. Move it to the top level of the extension:

extension MapsController: CLLocationManagerDelegate {
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.last else {return}
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion.init(center: center, latitudinalMeters: regionInMeters, longitudinalMeters: regionInMeters)
        maps.setRegion(region, animated: true)
    }

    // Move this method outside didUpdateLocations to make it accessible
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        checkLocationAuthorization()
    }
}

4. Verify Info.plist Location Permissions

Without the required permission description in your Info.plist, the system won’t show the location authorization prompt, so your app can’t access the user’s location. Add this key-value pair:

  • Key: NSLocationWhenInUseUsageDescription
  • Value: A clear message like "We need your location to find nearby gas stations."

5. Adjust Search Radius (Optional)

Your current search radius is only 1000 meters. If there are no gas stations within that range, no annotations will appear. Try increasing the radius:

let regionInMeters: Double = 5000 // Expand to 5km to cover more area

Quick Checks

  • Make sure your PlaceAnnotation class correctly conforms to MKAnnotation (it needs the coordinate property, plus your custom title and mapItem).
  • Add print statements in checkLocationAuthorization() to confirm which authorization status your app is getting (e.g., if the user denied access, you’ll want to show an alert prompting them to enable it).

After applying these fixes, your app should successfully fetch nearby gas stations and add their annotations to the map.

内容的提问来源于stack exchange,提问作者Marouen Abdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:22:32