SwfitUI navigationBarItems两次调用位置权限

问题描述 投票:0回答:1

我在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

swift xcode navigation uinavigationbar swiftui
1个回答
0
投票
1)使LocationManager仅是一个

class LocationManager: NSObject, ObservableObject { static var defaultManager: LocationManager = { LocationManager() }() ...

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

struct NewPage: View {

    @ObservedObject var locationManager = LocationManager.defaultManager
    ...
© www.soinside.com 2019 - 2024. All rights reserved.