swift如何将一个闭包添加到系统方法?

标签: ios Swift
发布时间: 2017/3/6 23:14:56
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我目前创建一个应用程序,使用 CLLocationManager,但不必要求应用程序委托的位置权限的提示,我让它执行时按下按钮"签入"。 我想创建一个闭包,从而允许用户签入后他们已经接受了允许位置服务。 现在用户接受位置服务后将其签入的代码不被激活,因为检查以查看是否启用了位置服务发生之前用户实际上接受位置服务。 这里是我的代码︰

typealias CompletionHandler = (success:Bool) -> Void

func askLocationPermission (completionHandler: CompletionHandler) {
    self.locationsManager.requestWhenInUseAuthorization()
}

@IBAction func checkInButtonPressed(sender: AnyObject) {

    askLocationPermission { (success) in
        if CLLocationManager.locationServicesEnabled() {
            self.locationsManager.delegate = self

            if let location = self.locationsManager.location {
                self.currentUserLatitude = location.coordinate.latitude
                self.currentUserLongitude = location.coordinate.longitude

                print("This is the current latitide: \(location.coordinate.latitude)")
                print("This is the current longitude: \(location.coordinate.longitude)")

                self.checkInLocation(
                    userInfo.sharedInstance.getAccessToken(), 
                    id: userInfo.sharedInstance.getMemberID()!, 
                    latitude: self.currentUserLatitude!, 
                    radius: 0.3, 
                    longitude: self.currentUserLongitude!)
            }
        }  
    }
}

解决方法 1:

而不是添加关闭,您可以只使用 CLLocationManager 提供的委托结构。这里是CLLocationManager 文件(以及如何使用它的较大教程),这里是委托文件

第一,当按下按钮,我们想要注册一个委托作为使我们获取所有更新从 CLLocationManager 。这种方式, CLLocationManager 会告诉我们授权状态更改时,当它获取一个新的位置。我们作为一个委托注册后,我们检查授权状态。如果它还没有决定,我们要求用户的权限。否则我们也不能访问,或用户已经给了权限,我们只是抓住他们的位置 !

@IBAction func checkInButtonPressed(sender: AnyObject) {

    // Set us as a delegate so the manager updates us
    self.locationsManager.delegate = self

    // Check our authorization status and request access if we need
    if CLLocationManager.authorizationStatus() ==  kCLAuthorizationStatusNotDetermined {
        // User hasn't given permission yet, ask for permission
        self.locationsManager.requestWhenInUseAuthorization()
    } else if CLLocationManager.authorizationStatus() ==  kCLAuthorizationStatusRestricted || CLLocationManager.authorizationStatus() ==  kCLAuthorizationStatusDenied {
        // Handle denied access
    } else {
        // We have access! Start listening now
        self.locationsManager.startUpdatingLocation()
    }
}

接下来,我们要处理的情形,在那里用户尚未,还没有给我们访问和我们目前对他们的权限弹出。他们可以点击是 (或没有) 所以我们想要处理这两种情况。就像在上面,如果他们拍了拍是,只是开始位置 !

// Called when the user changes the authorization status- in this case
//  this will change when the user taps yes/no in the permission popup
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if CLLocationManager.authorizationStatus() ==  kCLAuthorizationStatusRestricted || CLLocationManager.authorizationStatus() ==  kCLAuthorizationStatusDenied {
        // Handle denied access
    } else {
        // We have access! Start listening now
        self.locationsManager.startUpdatingLocation()
    }
}

最后,我们可以开始做些事情 !CLLocationManager每当它获取一个新的位置,所以这是完美的时间来检查调用这 !它可以需要一段时间得到一把好锁,所以你可能想要提醒用户在 checkInButtonPressed ,你正在它不久将更新它们。

// Called every time the locationManager gets a new location
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    self.currentUserLatitude = manager.coordinate.latitude
    self.currentUserLongitude = manager.coordinate.longitude

    print("This is the current latitide: \(location.coordinate.latitude)")
    print("This is the current longitude: \(location.coordinate.longitude)")

    self.checkInLocation(
        userInfo.sharedInstance.getAccessToken(), 
        id: userInfo.sharedInstance.getMemberID()!, 
        latitude: self.currentUserLatitude!, 
        radius: 0.3, 
        longitude: self.currentUserLongitude!)
}  
赞助商