SwfitUI navigationBarItems两次调用位置权限

时间:2019-12-20 21:39:10

标签: swift xcode navigation uinavigationbar swiftui

我在navigationBarItems下创建了一个按钮,此按钮将打开一个新的sheet,新工作表将弹出一个窗口,询问用户位置。但是,在新工作表中,CLLocationManager()已被调用两次,并且位置权限弹出窗口将在几秒钟后消失。创建常规按钮时,位置弹出窗口将一直停留在该位置,直到您选择一个选项为止,并且CLLocationManager()仅被调用一次。

代码

ConentView.swift

import SwiftUI

struct ContentView: View {


    @State var show = false
    @State var showEditPage = false

    var body: some View {


        NavigationView {
            List {
                Text("Text")
                Button("Location button") {
                    print("Location button tapped")
                    self.show.toggle()
                }.sheet(isPresented: $show) {
                    NewPage()
                }
            }
            .navigationBarItems(

                trailing:
                VStack {

                    Button(action: {
                        print("BarItemButton tapped")
                        self.showEditPage.toggle()
                    }) {
                        //Top right icon
                        Text("BarItemButton")
                    }.sheet(isPresented: $showEditPage) {
                        //Open sheet page
                        NewPage()
                    }

                }//End of trailing VStack
            )

        }

    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

NewPage.swift

import SwiftUI

struct NewPage: View {

    @ObservedObject var locationManager = LocationManager()

    var body: some View {

        Text("New Page")


    }
}

struct NewPage_Previews: PreviewProvider {
    static var previews: some View {
        NewPage()
    }
}

LocationManager.swift

import SwiftUI
import Foundation
import CoreLocation
import Combine

class LocationManager: NSObject, ObservableObject {

    private let locationManager = CLLocationManager()
    let objectWillChange = PassthroughSubject<Void, Never>()

    override init() {
        super.init()
        self.locationManager.delegate = self
        self.locationManager.desiredAccuracy = kCLLocationAccuracyBest

        self.locationManager.requestWhenInUseAuthorization()
        self.locationManager.startUpdatingLocation()

        print("In LocationManger.swift @initi, this is called")
    }

    @Published var locationStatus: CLAuthorizationStatus? {
        willSet {
            objectWillChange.send()
        }
    }

    @Published var lastLocation: CLLocation? {
        willSet { objectWillChange.send() }
    }

}

extension LocationManager: CLLocationManagerDelegate {

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        self.locationStatus = status

        print("In LocationManger.swift @Func locationManager, Status is updaing")

    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        guard let location = locations.last else { return }
        self.lastLocation = location
        print("Location is updating")

    }

}

GitHub

您可以随时下载该项目以在笔记本电脑上进行尝试以查看问题: Github Example Project

屏幕截图

enter image description here

1 个答案:

答案 0 :(得分:0)

以下是可能的更改方法,以使其在您的代码中起作用:

1)将LocationManager设为一个

class LocationManager: NSObject, ObservableObject {

    static var defaultManager: LocationManager = {
        LocationManager()
    }()
    ...

2)使用默认管理器,而不是每次SwiftUI要创建/复制视图结构时都创建

struct NewPage: View {

    @ObservedObject var locationManager = LocationManager.defaultManager
    ...