微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 startUpdatingLocation() 和 stopUpdatingLocation() 在特定视图中激活/停用位置更新

如何解决使用 startUpdatingLocation() 和 stopUpdatingLocation() 在特定视图中激活/停用位置更新

基于 stackoverflow 的一些代码示例,我创建了一个用于位置服务的类。位置服务在应用程序启动时立即启动,由上部系统栏中的导航符号指示。我的应用程序只需要特定视图中的位置服务,所以我想在特定事件中激活/停用位置服务。这可以减少能源消耗并提高客户的信心,即仅在需要时使用位置服务。

首先我定义了一个 Locationviewmodel 类:

import SwiftUI
import Foundation
import Combine
import CoreLocation
import CoreMotion

class Locationviewmodel: NSObject,ObservableObject
{

    @Published var userLatitude: Double = 0
    @Published var userLongitude: Double = 0
        
    private let locationManager = CLLocationManager()

    override init()
    {
        super.init()
        
        self.locationManager.delegate = self
        
        self.locationManager.startUpdatingLocation()
    }
    
    // I tried this to access the startUpdatingLocation() method,but it did not work
    func startUpdatingLocation()
    {
        self.locationManager.startUpdatingLocation()
    }
        
}

extension Locationviewmodel: CLLocationManagerDelegate
{
    func locationManager(_ manager: CLLocationManager,didUpdateLocations locations: [CLLocation])
    {
        guard let location = locations.last else { return }
        
        userLatitude = location.coordinate.latitude
        userLongitude = location.coordinate.longitude
    }
}

接下来,在作为 NavigationView 一部分的特定 LocationView 中,我创建 Locationviewmodel 类的实例:

import SwiftUI

struct LocationView : View
{
    // some say,that a @StateObject is preferred over @Observedobject,see:
    // https://stackoverflow.com/questions/59620573/handle-swiftui-and-corelocation-with-mvvm-pattern
    @Observedobject var locationviewmodel = Locationviewmodel()
    
    var body: some View
    {
        vstack
        {
            Text("Latitude: \(locationviewmodel.userLatitude)")
            Text("Longitude: \(locationviewmodel.userLongitude)")
        }
        .navigationTitle("Location")
        .navigationBarTitledisplayMode(.inline)
    }
}

问题:

  1. 为什么应用启动时定位服务就启动了?覆盖 init() 方法调用 startUpdatingLocation(),但 LocationView(定义为 NavigationView 的一部分)不会在应用程序启动时显示。这是 NavigationView 的效果吗?

  2. 如何从实例外部访问 self.locationManager 的 startUpdatingLocation() 方法?有什么办法可以直接做到这一点,还是有必要创建一个特定的包装方法(因为我已经尝试过但没有成功)? Locationviewmodel 实例不提供任何方法(XCode 说没有完成)。

  3. 当特定视图变为可见/不可见时,如何开始/停止位置更新(导航符号消失)?我发现的所有代码示例都实现了永久位置更新。

解决方法

解决方案:

我的错误是试图在声明视图主体之前调用 locationViewModel.locationManager.startUpdatingLocation() 方法。

file1,a1,a2,a3,a4
file2,b1,a4

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。