我正在使用swift和mapkit开发一个应用程序。除了mainUser注释视图外,mapView还有一些注释。我想要的是当用户从另一个ViewController中选择UITableViewCell中的单元格时,他应该被带到mapView ViewController并选择一个特定的引脚。我通过传递一个名为“fromSegue”的对象来做到这一点。所有这些都很有效,除非用户想要自己选择:选择任何类型的CustomPointAnnotationView都没有问题,但是当选择userLocation时,函数ViewForAnnotation尚未被调用。
这是设置地图区域的功能。这是应该进行注释选择的地方。
func setFPS() {
print("[SFPS] - setFPS")
self.mainUser.setObject(mainUserLocation.latitude, forKey: "latitude")
self.mainUser.setObject(mainUserLocation.longitude, forKey: "longitude")
if self.fromSegue != nil {
print("[SFPS] - setModFPS")
if fromSegue.type == 11 {
print("[SFPS] - type11 - Showing a notif of type 11")
let latititi:Double = fromSegue.latitude as! Double
let longigigi:Double = fromSegue.longitude as! Double
self.mapScope = CLLocationCoordinate2DMake(latititi, longigigi)
var annotJar = pinJar.filter{$0.nickName == self.fromSegue.name}
print("[SFPS] - type11 - ALL RIGHT LETS DO IT")
let annot = annotJar[0]
Map.selectAnnotation(annot,animated: true)
fromSegue = nil
print("[SFPS] - type11 - Over")
} else if fromSegue.type == 21 {
print("[SFPS] - type21 - Showing a notif of type 21")
Map.selectAnnotation(self.Map.userLocation,animated: true)
self.mapScope = mainUserLocation
fromSegue = nil
} else {
print("[SFPS] - no type! problem here")
self.mapScope = CLLocationCoordinate2DMake(mainUserLocation.latitude, mainUserLocation.longitude)
}
} else {
self.mapScope = CLLocationCoordinate2DMake(mainUserLocation.latitude, mainUserLocation.longitude)
}
Map.rotateEnabled = true
let span = MKCoordinateSpanMake(0.001, 0.001)
print("[SFPS] - span made")
let region = MKCoordinateRegionMake(mapScope, span)
print("[SFPS] - region made")
Map.setRegion(region, animated: true)
print("[SFPS] - region is all set - Over")
}
当fromSegue属于类型11时,它应该选择customPointAnnotationview。这就是控制台中发生的事情:
[SFPS] - setFPS
[SFPS] - setModFPS
[SFPS] - type11 - Showing a notif of type 11
[SFPS] - type11 - ALL RIGHT LETS DO IT
[VFA] - ViewForAnnotation
[VFA] - the annotation: <PING.CustomPointAnnotation: 0x1890d570>. from: Optional(Optional("newParse44"))
[VFA] - of kind random folk
[VFA] - of kind random folk - building...
[DSAV] - didSelectAnnotationView: Optional(Optional("newParse44"))
[DSAV] - guest
[DSAV] - Optional("newParse44") selected
[SFPS] - type11 - Over
[SFPS] - span made
[SFPS] - region made
[SFPS] - region is all set - Over
正在执行函数setFPS(),当即将选择注释,创建,然后选择注释,然后执行其余的setFPS()。大!一切都在这里工作。
现在当fromSegue属于类型21时,应选择userLocation引脚。以下是控制台中发生的事情:
[SFPS] - setFPS
[SFPS] - setModFPS
[SFPS] - type21 - Showing a notif of type 21
2015-11-06 07:40:31.116 PING[1272:574013] ERROR: Trying to select an annotation which has not been added
[SFPS] - span made
[SFPS] - region made
[SFPS] - region is all set - Over
因此,在这种情况下,尚未添加userlocation注释,因为尚未调用viewForAnnotation(足够早?)。我的问题是为什么?我可以手动调用viewForAnnotation吗?
非常感谢您的帮助
答案 0 :(得分:1)
在MKMapView上的setCenterCoordinate
之前尝试selectAnnotation
例如:
mapview.setCenterCoordinate(mapview.userLocation.coordinate, animated: false)
mapview.selectAnnotation(mapview.userLocation,animated: true)
<强>更新强>
获取用户位置需要一些时间。
MKMapViewDelegate
已didUpdateUserLocation
更新每个位置更新。我们希望第一次触发userLocation
然后选择它。
在bool
中设置var
ViewController
。此var
将用于首次选择注释。我们希望忽略didUpdateUserLocation
的所有其他回调。
class MapViewController: UIViewController {
var didUpdateUserLocation = false
...
...
}
现在实施MKMapViewDelegate
的{{1}}功能。
didUpdateUserLocation
答案 1 :(得分:0)
如果您想在选择时调用ViewForAnnotation
,则必须在自己的位置添加注释。单击系统注释时,它不会调用方法ViewForAnnotation
答案 2 :(得分:0)
感谢@Warif提示,我提出了这个解决方案。虽然我知道这是一台糟糕的金山机器,但它完成了工作。
在didupdatelocations
中设置bool不起作用,因为我必须等待viewforannotation
被调用。我试图在为mainuserlocation调用viewforannotation
时放置bool,但它也不起作用(关于用户图像的奇怪错误)。我最终决定设置一个Int作为计数来知道所有前面的步骤何时完成,我可以选择注释。
class MapViewController: UIViewController {
var didUpdateUserLocation: Int = 0
...
...
}
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if self.fromSegue != nil {
if self.fromSegue.type == 21 {
if self.didUpdateUserLocation == 0 {
self.didUpdateUserLocation = 1
}
}
}
}
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
if self.fromSegue != nil {
if self.fromSegue.type == 21 {
if self.didUpdateUserLocation == 1 {
self.didUpdateUserLocation = 2
}
}
}
...
...
...
}
override func viewDidAppear(animated: Bool) {
if self.fromSegue != nil {
if self.fromSegue.type == 21 {
if self.didUpdateUserLocation == 2 {
Map.selectAnnotation(self.Map.userLocation,animated: true)
self.fromSegue = nil
self.didUpdateUserLocation = 3
}
}
}
}