【问题标题】:How to use MKMapView's "Shows User Location" in iOS8?如何在 iOS 8 中使用 MKMapView“显示用户位置”?
【发布时间】:2015-01-29 13:55:18
【问题描述】:

当您在 Interface Builder 中将 MKMapView 组件添加到视图时,有一些复选框可以让您配置它的显示内容:

当您选中“用户位置”时,它会自动在地图上显示用户的位置。

但是,从 iOS 8 开始,您应该在显示用户位置之前请求位置许可。如果不这样做,您会在控制台中收到“尝试在不提示的情况下启动 MapKit 位置更新”警告。

所以我在 plist 中添加了一个 NSLocationWhenInUseUsageDescription 键,并将此代码添加到 viewDidLoad

if CLLocationManager.authorizationStatus() == .NotDetermined {
    CLLocationManager().requestWhenInUseAuthorization()
}

这似乎不起作用。我确实收到了一个请求许可的弹出窗口,但在我选择答案之前,它会自行隐藏,地图会在其下方加载,并且我会在控制台中收到警告。

我知道我可以在代码中设置showsUserLocation 属性,只有在获得许可后;但我的观点是,IB 中有这个复选框应该做同样的事情,除了它立即开始跟踪。这是否意味着自 iOS 8 以来我们根本不应该使用此复选框?还是我用错了?

--

更新:实际上,无论是否设置了“显示用户位置”,弹出窗口都会自行隐藏。我已经尝试在viewWillAppearviewDidAppear 中这样做,但这并没有帮助。所以我不确定在使用MKMapView 时我应该在哪里调用requestwhenInUseAuthorization...

【问题讨论】:

    标签: ios ios8 mapkit core-location cllocationmanager


    【解决方案1】:

    requestWhenInUseAuthorization 是异步的 - 在实际尝试跟踪或显示用户的位置之前,请确保您正在收听地图视图委托中的授权更改状态。

    【讨论】:

    • 但是事情是这样的,我并没有开始在代码中跟踪用户的位置。如果我在 IB 中选中“显示:用户位置”,则 NIB 加载器会执行此操作,并且它会自动启动它并与我在委托/控制器中所做的任何事情异步启动。所以我要问的是,有没有办法在 iOS 8 中正确使用这个复选框?
    【解决方案2】:

    您的CLLocationManager 实例在方法执行完成后由ARC 释放。一旦实例被释放,对话框就消失了。解决方案相当简单。将 CLLocationManager 实例从方法级变量更改为类级实例变量,并使其 Strong - 这是用于 ObjC :)

    对于 Swift... 做这样的事情:

        class YourViewController: UIViewController,CLLocationManagerDelegate {
        ...
        let locationManager = CLLocationManager()
    
    
        override func viewDidLoad() {
                super.viewDidLoad()
                // Ask for permission for location
                locationManager.delegate = self
    
                if(locationManager.respondsToSelector("requestAlwaysAuthorization")) {
                    locationManager.requestAlwaysAuthorization()
                    //or
                    //locationManager.requestWhenInUseAuthorization()
                }
        ...
        }
    

    所以...不要使用CLLocationManager().requestWhenInUseAuthorization() - 而是使用locationManager.requestWhenInUseAuthorization() - locationManager 提前声明

    【讨论】:

    • 啊,你说得对,ARC 让我完全忘记了内存管理,这有时会导致这样的事情。如果我不保留经理,现在看起来它甚至根本不会显示弹出窗口。如果我这样做,它应该可以正常工作,谢谢。
    • 很好,我猜对委托的引用不足以保留实例。再次感谢!
    • @Quincy Delegates 应该始终是 WEAK,否则你会到处都得到保留周期。
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2011-08-30
    • 2013-04-17
    • 1970-01-01
    • 2022-08-24
    相关资源
    最近更新 更多