委托方法如何在Swift中工作?

时间:2014-12-29 02:47:59

标签: ios oop swift delegates cllocationmanager

我正在尝试学习如何将位置编入应用程序,而这整段代码真的让我与locationManager和委托人混淆了。当你声明一个名为locationManager的函数时,我根本不知道发生了什么。你正在定义这个函数,locationManager,对吗?有2个参数。究竟是什么调用这个locationManager?在浏览Complete iOS Developer Course时,他会获取此locationManager代码段并复制粘贴它,而不解释复制和粘贴时您正在执行的操作背后的原理。是否有一些代码行调用“locationManager(...)”?如果是这样,这会发生在哪里?我的大脑一直在想,如果它是一个继承自超类CLLocationManagerDelegate的函数,你不是必须重写它才能让它工作吗?你能否对代表们的工作方式有一些直觉?

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {



@IBOutlet var myMap : MKMapView!

var manager:CLLocationManager!


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.


    // Core Location
    manager = CLLocationManager()
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()




}


func locationManager(manager:CLLocationManager, didUpdateLocations locations:[AnyObject]) {

    var userLocation:CLLocation = locations[0] as CLLocation

    var latitude:CLLocationDegrees = userLocation.coordinate.latitude

    var longitude:CLLocationDegrees = userLocation.coordinate.longitude

    var latDelta:CLLocationDegrees = 0.01

    var lonDelta:CLLocationDegrees = 0.01

    var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)

    var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)

    var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)

    myMap.setRegion(region, animated: true)

}

func locationManager(manager:CLLocationManager, didFailWithError error:NSError)
{
    println(error)
}

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

CLLocationManagerDelegate协议中定义的这些委托方法由您实例化并在CLLocationManager变量中引用的manager对象调用。因此,您已经实例化了CLLocationManager对象,您已经要求它在有位置更新时通知您,并通过调用您已实现的这些委托方法来实现。

你说:

  

我的大脑一直在想,如果它是一个继承自超类CLLocationManagerDelegate的函数,你是不是必须重写它才能让它工作?

CLLocationManagerDelegate不是一个类。这是一个“协议”。它定义了delegate对象(在本例中,您的视图控制器)可能/应该实现的功能。所以,没有什么可以覆盖的。