在没有函数调用可见的程序中,什么时候调用 swift 函数?
When are swift functions called in programs where no function call is visible?
The example below 取自 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
}
}
这个
mapView.delegate = self
和
class ViewController: UIViewController, MGLMapViewDelegate {
负责调用它们,在 MapKit 框架中 class MKMapView
有一个委托 属性 当你设置正确的委托时内部发生这种情况
delegate?.mapView(self,//)
你也不应该return nil here
func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
这些是由名为 MGLMapViewDelegate
的协议声明的委托方法,它已实现到您的 class
class ViewController: UIViewController, MGLMapViewDelegate { ... }
通过将某个对象的 delegate
设置为您的控制器 (= self
),就像您在 viewDidLoad
中对 MGLMapView
所做的那样
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
所以当函数被调用时在 MapView
关于调用他们的案例中,他们将回到你的 self
中的实施方,在这种情况下 UIViewController
,我建议阅读更多关于代表 here,如此快捷的回答,函数不是在同一个 class 中调用的。
The example below 取自 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
}
}
这个
mapView.delegate = self
和
class ViewController: UIViewController, MGLMapViewDelegate {
负责调用它们,在 MapKit 框架中 class MKMapView
有一个委托 属性 当你设置正确的委托时内部发生这种情况
delegate?.mapView(self,//)
你也不应该return nil here
func mapView(_ mapView: MGLMapView, viewFor annotation: MGLAnnotation) -> MGLAnnotationView? {
这些是由名为 MGLMapViewDelegate
的协议声明的委托方法,它已实现到您的 class
class ViewController: UIViewController, MGLMapViewDelegate { ... }
通过将某个对象的 delegate
设置为您的控制器 (= self
),就像您在 viewDidLoad
MGLMapView
所做的那样
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
所以当函数被调用时在 MapView
关于调用他们的案例中,他们将回到你的 self
中的实施方,在这种情况下 UIViewController
,我建议阅读更多关于代表 here,如此快捷的回答,函数不是在同一个 class 中调用的。