2015-12-15 3 views
0

Я изучаю Swift, а в коде фрагмента ниже есть метод locationManager. Почему я должен писать это, даже если он не был вызван в коде действия кнопки «Найти меня»?Что вызывает doUpdateLocations в моем коде Swift?

import UIKit 
import MapKit 
import CoreLocation 

class ViewController: `UIViewController, CLLocationManagerDelegate` { 
    @IBOutlet weak var Mapview: MKMapView! 
    var manager = CLLocationManager() 

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

    let pinLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(51.5078788, -0.000003928) 
    let objectAnn = MKPointAnnotation() 
    objectAnn.coordinate = pinLocation 
    objectAnn.title = "London Bridge" 
    objectAnn.subtitle = "London, United kingdom" 
    self.Mapview.addAnnotation(objectAnn) 
    } 

    override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
    } 

    @IBAction func Directions(sender: AnyObject) { 
    UIApplication.sharedApplication().openURL(NSURL(string: "http://maps.apple.com/maps?daddr=51.5078788,-0.000003928")!) 
    } 

    @IBAction func LocateMe(sender: AnyObject) { 
    manager.delegate = self 
    manager.desiredAccuracy = kCLLocationAccuracyBest 
    manager.requestWhenInUseAuthorization() 
    manager.startUpdatingLocation() 

    Mapview.showsUserLocation = true 
    } 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    let userlocation:CLLocation = locations[0] as CLLocation 

    manager.stopUpdatingLocation() 

    let location = CLLocationCoordinate2D(latitude: userlocation.coordinate.latitude, longitude: userlocation.coordinate.longitude) 
    let span = MKCoordinateSpanMake(0.5, 0.5) 
    let region = MKCoordinateRegion(center: location, span: span) 

    Mapview.setRegion(region, animated: true) 
    } 
} 
+0

То, что вы хотите достичь с помощью выше кода? вы хотите отображать только текущее местоположение, чем не нужно. –

ответ

0

Это называется делегат.

Вы используете CLLocationManagerDelegate.

Поскольку вы назначаете делегата manager контроллеру вида, используя этот код manager.delegate = self, он будет автоматически вызван делегатским событием в определенных условиях.

В вашем коде, если ваше местоположение обновляется, контроллер вида будет автоматически запускать эту функцию func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])

+0

Большое спасибо за это, слово «делегат» делает много isseus дозой, не понимающей о быстром очищении –

+0

@mahmoudgamal В концепции делегирования вы передаете действия, и в этом случае события (когда местоположения обновлялись) на другой объект, который называемый «делегат». Здесь вы устанавливаете 'ViewController' в делегат менеджера местоположений, чтобы этот метод вызывался каждый раз, когда местоположения обновлялись. – Qbyte

1

Код в вопросе заключается в следующем:

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

Я понимаю, что вы сейчас обучение Swift , поэтому может быть странно иметь код, который вы не называете самим собой. Но в этом примере код вызывается iOS.

Вы видите, когда вы пишете manager.startUpdatingLocation(), это приводит к тому, что iOS хочет сообщить вам, когда изменилось местоположение пользователя. Это делается, если посмотреть, есть ли у вас метод didUpdateLocations выше. Если у вас есть этот метод в вашем коде, iOS будет называть его для вас - это не тот, который вы назовете самим собой.

0

В вашей функции LocateMe (отправитель :) вы вызываете manager.startUpdatingLocation(), это сообщает CLLocationManager, чтобы начать поиск ваших (я думаю) gps-координат. Однако теперь каждый раз, когда ваше местоположение обновляется, этот CLLocationManager вызовет функцию locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]. Это связано с тем, что обновления являются асинхронными, и как только ваше местоположение было обновлено, вы будете уведомлены об этой функции.

+0

Большое спасибо за ваш ответ, –

0

В методе LocateMe вы устанавливаете delegate в качестве указателя местоположения вашего контроллера.

Метод func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) вызывается при изменении местоположения.

Для дополнительной информации проверить это: https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManagerDelegate_Protocol/#//apple_ref/occ/intfm/CLLocationManagerDelegate/locationManager:didUpdateLocations:

0

Я думаю, вы должны добавить NSLocationWhenInUseUsageDescription в .plist, а затем установить местоположение и попробовать это

Смежные вопросы