我正在学习如何使用新的Swift语言(只有Swift,没有Objective-C).要做到这一点,我想做一个简单的视图与 map (MKMapView).我想找到并更新用户的位置(比如在Apple Map应用程序中).

我试过了,但什么都没发生:

import MapKit
import CoreLocation

class MapView : UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var map: MKMapView!
    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()

        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }
}

你能帮帮我吗?

推荐答案

您必须覆盖CLLocationManager.didUpdateLocations(CLLocationManagerDelegate的一部分),以便在位置管理器检索当前位置时收到通知:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    if let location = locations.last{
        let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
        let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))
        self.map.setRegion(region, animated: true)
    }
}

注意:如果您的目标是iOS 8或更高版本,则必须在信息中包含NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription键.请务必让定位服务正常工作.

Swift相关问答推荐

防止NavigationLink自行返回导航视图

如何避免使用DispatchSemaphores时线程爆炸?

如何在visionOS上删除PhotosPicker背景 colored颜色 ?

减go 用SWIFT struct 填充的NSCountedSet

从后台线程获取@发布属性的值(不更改它)是正确的吗?

对实例方法appendInterpolation的调用没有完全匹配

Swift 运算符中 inout 的行为

DispatchQueue.main.asyncAfter 等同于 Swift 中的 struct 化并发?

(Swift)混淆了函数内 for-in 循环的返回值和循环后(函数内)的返回值)

防止带有背景的文本扩展到 maxWidth

为 SwiftUI 中的属性提供默认值

当使用 CGFloat 而不是数字文字时,为什么 node 的位置会发生变化?

如何在 Swift 中的两个 UIView 中心之间添加线?

判断 Swift 程序是否正在输出到终端

使用 Alamofire 4.0 (Swift 3) 下载文件

在 Swift 中计算两个日期之间的差异

将强制向下转换视为可选将永远不会产生零

try 在解除分配时加载视图控制器的视图... UIAlertController

Swift中字节数组的NSData

使用 ARAnchor 插入 node 和直接插入 node 有什么区别?