Когда быстрые функции вызываются в программах, где нет вызова функции?
Приведенный ниже пример взят из 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 ответа
Это методы делегата, объявленные протоколом 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)
...
}
}
Это
mapView.delegate = self
с
class ViewController: UIViewController, MGLMapViewDelegate {
отвечает за их вызов, внутри фрейма MapKit работает класс MKMapView
имеет свойство делегата, когда вы устанавливаете правильный делегат внутренне, это происходит
delegate?.mapView(self,//)
также вы не должны возвращать ноль здесь
func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
Это функции-делегаты, а не обычные функции, которые вы вызываете, они больше похожи на функции, которые вызываются на основе действия, и вы установили MapView.delegate
в self
поэтому, когда функции вызывают в MapView
относительно случая, который вызвал их, они вернутся к реализованной стороне в вашем self
в этом случае UIViewController
Я предлагаю прочитать больше об делегатах здесь, так что быстрый ответ, функции не вызываются в том же классе.