Ios 为什么不是';位置经理没有更新位置工作吗? 使用CeleloCoC.Buffic添加到构建阶段并导入到文件的顶部,如果我把下面的内容放入一个带有按钮的视图控制器中,可以得到位置信息: @IBAction func locationButton(sender: AnyObject) { locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() }

Ios 为什么不是';位置经理没有更新位置工作吗? 使用CeleloCoC.Buffic添加到构建阶段并导入到文件的顶部,如果我把下面的内容放入一个带有按钮的视图控制器中,可以得到位置信息: @IBAction func locationButton(sender: AnyObject) { locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestWhenInUseAuthorization() locationManager.startUpdatingLocation() },ios,swift,core-location,cllocationmanager,Ios,Swift,Core Location,Cllocationmanager,接着是locationManager didUpdateLocations,其中包含一个CLGeocoder()。reverseGeocodeLocation completionHandler,该处理程序在另一个函数中显示位置信息—这很有效 但是,当我尝试在数据模型中传输相同的代码时,它不起作用。我使用以下内容设置模型: import CoreLocation class Record: NSObject, CLLocationManagerDelegate { let locati

接着是locationManager didUpdateLocations,其中包含一个CLGeocoder()。reverseGeocodeLocation completionHandler,该处理程序在另一个函数中显示位置信息—这很有效

但是,当我尝试在数据模型中传输相同的代码时,它不起作用。我使用以下内容设置模型:

import CoreLocation

class Record: NSObject, CLLocationManagerDelegate
{
    let locationManager = CLLocationManager()
因为没有按钮,我将locationManager代码放入:

        override init()
{
    iD = NSUUID().UUIDString

    super.init()

    if (CLLocationManager.locationServicesEnabled())
    {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        self.locationManager.requestWhenInUseAuthorization()

        switch CLLocationManager.authorizationStatus() {
        case .AuthorizedWhenInUse, .AuthorizedAlways:
            locationManager.startUpdatingLocation()
        case .NotDetermined:
            locationManager.requestWhenInUseAuthorization() // or request always if you need it
        case .Restricted, .Denied:
            print("tell users that they need to enable access in settings")
        default:
            break
        }
        print("Location services available")
        if CLLocationManager.authorizationStatus() == .NotDetermined
        {
            print("Still Not Determined")
        }
    } else { print("Location services not available") }

}
我可以得到“定位服务”。但是下面的代码从不将任何内容打印到控制台,也不调用函数toSetLocationStamped

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!)
{
    print("started location man")
    CLGeocoder().reverseGeocodeLocation(manager.location, completionHandler:        //pass the location co-ordinates
        {
            (placemarks, error) -> Void in

            if (error != nil)
            {
                println("Reverse geocoder failed with error" + error.localizedDescription)
                return
            }

            if placemarks.count > 0         //process the location array (placemarks)
            {
                let pm = placemarks[0] as! CLPlacemark
                self.toSetLocationStamped(pm)
                print("got here")
            } else
            {
                println("Problem receiving data from geocoder")
            }
    })
}
如果我用一个简单的打印日志在类记录中放置Denit,则没有输出

deinit
{
    print("deinit")
}
我正在初始化MasterViewController类中所需初始化的dummyRecord:Record:

class MasterViewController: UITableViewController
{
var records = [Record]()
var subjectDescription: String?

// weak var delegate: MonsterSelectionDelegate?        // property for object conforming to MSDelegate

required init(coder aDecoder: NSCoder)      //      // coder because class is loaded from Storyboard
{
    super.init(coder: aDecoder)

    var dummyRecord1 = Record()
    dummyRecord1.details = "All was very good and strong with a little bit of lemon on the side of the hill."
    dummyRecord1.dateTimeEntered = NSDate(dateString: "2015-07-22")
    dummyRecord1.subject = "Clouds"
    dummyRecord1.locationEntered = "Drittelsgasse 1, 69493 Großsachsen, Germany."
    dummyRecord1.photos.append(UIImage(named: "zombies.jpg")!)

    records.append(dummyRecord1)
}
你打电话之后

self.locationManager.requestWhenInUseAuthorization()
您无法立即开始更新位置。这个调用是异步的

以下是您应该如何正确地执行此操作:

1) 检查授权状态:

switch CLLocationManager.authorizationStatus() {
    case .AuthorizedWhenInUse, .AuthorisedAlways:
        locationManager.startUpdatingLocation()
    case .NotDetermined:
        locationManager.requestWhenInUseAuthorization() // or request always if you need it
    case .Restricted, .Denied:
        // tell users that they need to enable access in settings
    default:
        break
}
2) 如果您之前已授权您的应用程序,则应更新位置。但是,如果您没有这样做,将出现一个弹出窗口。为了响应授权状态的变化,您需要添加另一项功能:

func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if (status == .AuthorizedAlways) || (status == .AuthorizedWhenInUse) {
        locationManager.startUpdatingLocation()
    }
}

您如何创建此对象的实例以及您是否持有引用以使其不会被释放?请尝试将代码放置在主线程块之间的init方法中。我曾经遇到过这样的问题。就Paulw11而言,您可能希望实现一个
deinit
方法,在解除分配此对象时记录该方法,以确保在异步调用完成之前不会释放该对象。我已更新了问题,尽我所能解决这些评论-尤其是Paulw和Rob。我不认为这是另一个问题的重复,如果是,请解释如何设置NSLocationAlwaysUsageDescription(针对第1点);对于第3点,我真的希望看到在模型中设置的值,而不是在视图控制器级别调用(这不是MVC,还是我做得太过分了)。这是有道理的。我已经尝试了我认为你的意思,并更新了我的问题-请参阅override init。但是,不幸的是,它仍然没有要求允许位置服务,我仍然没有进入didUpdateLocations方法。而且,如果我在覆盖初始化结束时选中CLLocationManager.authorizationStatus()==.NotDetermined,它的计算结果仍然为true。我真的一定是做了些傻事。啊-但是我确实进入了DidChangeAuthorizationStatus,但是if语句(.authorizedAllways或..WhenInUse)没有计算true…@dr如果你没有得到一个请求授予位置访问权限的弹出窗口,这意味着你禁用了位置访问权限。它可以全局禁用,也可以针对此特定应用禁用。这个弹出窗口只出现一次,如果用户按“否”,则不能再次询问-他们必须在“位置设置”中手动打开它。转到设置->隐私->位置服务,确保它们在全球范围内以及在您的应用程序中都已启用。我认为您是对的,因为我在另一个项目中尝试了您的代码,效果不错。但是,如果我进入模拟器的设置,全局设置是打开的。但是,如果我从那里单击系统服务,整个模拟器就会冻结(不能前进,不能后退)。我可以访问“手机”外的菜单,但我必须关闭整个模拟器才能在实际手机上执行任何操作。我推测在系统服务中将是我的应用程序设置(?。@DrWhat刚从模拟器中删除你的应用程序并重新安装:)