【问题标题】:How do delegate methods work in Swift? [closed]委托方法在 Swift 中是如何工作的? [关闭]
【发布时间】:2014-12-29 02:47:59
【问题描述】:

我正在尝试学习如何将位置编程到应用程序中,而这整段代码真的让我对 locationManager 和委托感到困惑。当您声明一个名为 locationManager 的函数时,我完全不明白发生了什么。您正在定义这个函数,locationManager,对吗?有2个参数。那么究竟是什么调用了这个 locationManager 呢?在浏览Complete iOS Developer Course 时,他拿了这个locationManager sn-p 并复制粘贴它,而没有解释你在复制和粘贴时所做的工作背后的原理。是否有一些代码行调用“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)
}

非常感谢您的帮助!

【问题讨论】:

    标签: ios oop swift delegates cllocationmanager


    【解决方案1】:

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

    你说:

    我的大脑一直在想,如果它是一个从超类CLLocationManagerDelegate 继承的函数,您是否不必重写它才能使其工作?

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

    【讨论】:

    • 好的,所以这些委托方法是可选的,对吧?那么 Swift 怎么知道我已经在我的代码中实现了这些方法呢?
    • 在这种情况下,它依赖于NSObject 提供的respondsToSelector 方法(所有这些Cocoa Touch 类都来自该方法)。如果它是纯 Swift,那么还有另一种机制来确认是否符合协议的可选方法(请参阅 The Swift Language: Protocols 中的 可选协议要求 讨论),但这在这里并不真正相关。
    • @rb612 您可以参考核心能力文档中的delegationprotocol 讨论,或Programming in Objective-C: Protocols。它专注于 Objective-C,但原理是一样的。
    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多