首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用startUpdatingLocation()和stopUpdatingLocation()激活/停用特定视图中的位置更新

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

Stack Overflow用户
提问于 2021-05-29 21:59:07
回答 1查看 394关注 0票数 0

基于堆栈溢出中的一些代码示例,我创建了一个用于位置服务的类。当应用程序启动时,位置服务将立即启动,由上系统栏中的导航符号指示。我的应用程序只需要特定视图中的位置服务,所以我想激活/禁用特定事件上的位置服务。这可以降低能源消耗,提高客户的信心,只有在需要时才会使用定位服务。

首先,我定义了一个类LocationViewModel:

代码语言:javascript
复制
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
    }
}

接下来,在一个特定的LocationView ( NavigationView的一部分)中,我创建了一个LocationViewModel类的实例:

代码语言:javascript
复制
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?

的效果吗?

  1. 如何从实例外部访问Sel.LocationManager的startUpdatingLocation()方法?是否有任何直接这样做的方法,或者是否有必要创建一个特定的包装方法(就像我已经尝试过的那样,但没有成功)?LocationViewModel实例不提供任何方法(XCode说没有完成)。

当特定视图变为可见/不可更改时,

  1. 如何启动/停止位置更新(导航符号要消失)?我发现的所有代码示例都实现了永久位置更新.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-31 09:12:00

解决方案:

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

代码语言:javascript
复制
        .navigationTitle("Simulation")
        .navigationBarTitleDisplayMode(.inline)
        .onAppear(perform: {locationViewModel.locationManager.startUpdatingLocation()})
        .onDisappear(perform: {locationViewModel.locationManager.stopUpdatingLocation()})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67756026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档