Когда быстрые функции вызываются в программах, где нет вызова функции? - PullRequest
0 голосов
/ 19 марта 2019

Пример ниже взят из Mapbox и показывает, как пометить местоположение на карте с аннотацией. Я понимаю, что viewDidLoad вызывается при запуске приложения, и это то, что запускает все внутри функции viewDidLoad.

Я не понимаю, как называются последние две функции в этой программе (которые, похоже, имеют название mapView). Я не вижу ссылки на них внутри viewDidLoad

import Mapbox

class ViewController: UIViewController, MGLMapViewDelegate {
  override func viewDidLoad() {
    super.viewDidLoad()

    let mapView = MGLMapView(frame: view.bounds)
    mapView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Set the map’s center coordinate and zoom level.
    mapView.setCenter(CLLocationCoordinate2D(latitude: 40.7326808, longitude: -73.9843407), zoomLevel: 12, animated: false)
    view.addSubview(mapView)

    // Set the delegate property of our map view to `self` after instantiating it.
    mapView.delegate = self

    // Declare the marker `hello` and set its coordinates, title, and subtitle.
    let hello = MGLPointAnnotation()
    hello.coordinate = CLLocationCoordinate2D(latitude: 40.7326808, longitude: -73.9843407)
    hello.title = "Hello world!"
    hello.subtitle = "Welcome to my marker"

    // Add marker `hello` to the map.
    mapView.addAnnotation(hello)
  }

  // Use the default marker. See also: our view annotation or custom marker examples.
  func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
    return nil
  }

  // Allow callout view to appear when an annotation is tapped.
  func mapView(_ mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
    return true
  }
}

Ответы [ 3 ]

2 голосов
/ 19 марта 2019

Это методы делегата, объявленные протоколом MGLMapViewDelegate, который реализован в вашем классе

class ViewController: UIViewController, MGLMapViewDelegate { ... }

Установив delegate какого-либо объекта в качестве контроллера (= self), как вы сделали с MGLMapView в viewDidLoad

mapView.delegate = self

вы говорите, что когда какой-то метод вызывается для делегата mapView, будет вызываться метод, который вы реализовали, например mapView(_:viewFor:) -> MGLAnnotationView?.


В любом случае, ваш mapView должен быть переменной экземпляра, в противном случае вы потеряли ссылку на него

class ViewController: UIViewController, MGLMapViewDelegate {

    var mapView: MGLMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        mapView = MGLMapView(frame: view.bounds)
        ...
    }
}
0 голосов
/ 19 марта 2019

Это функции-делегаты, а не обычные функции, которые вы вызываете, они больше похожи на функции, вызываемые на основе действия, и вы установили MapView.delegate на self, поэтому, когда функции вызываются в MapView относительнов случае, когда они их вызвали, они вернутся к реализованной стороне в вашем self, в этом случае UIViewController, я предлагаю прочитать больше о делегатах здесь , так что быстрый ответ, функции не вызываются втот же класс.

0 голосов
/ 19 марта 2019

Это

mapView.delegate = self

с

class ViewController: UIViewController, MGLMapViewDelegate {

отвечает за их вызов, внутри MapKit frameWork класс MKMapView имеет свойство делегата, когда вы устанавливаете правильный делегат внутренне, это происходит

delegate?.mapView(self,//)

также вы не должны возвращать ноль здесь

func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
...