我使用dispatch
添加ViewController
到AnotherViewController
的标记
我正在使用:
ViewTypeViewController
class ViewTypeViewController: UIViewController {
var places = [PlaceModel]()
override func viewDidLoad() {
super.viewDidLoad()
DispatchQueue.main.async(execute: {
print("Run on background thread!!!")
self.places.append(PlaceModel(_id: 0, _name: "Park", _lat: 34.1331168, _lng: -118.3550723, _icon: "i01" ) )
self.places.append(PlaceModel(_id: 1, _name: "Library", _lat: 34.1251168, _lng: -118.3590723, _icon: "i02"))
let mapVC = self.storyboard!.instantiateViewController(withIdentifier: "MapVC") as! MapViewController
mapVC.places = self.places
mapVC.callerLoaded = true
mapVC.load()
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
的MapViewController
class MapViewController: UIViewController, GMSMapViewDelegate {
@IBOutlet weak var mapView: GMSMapView!
@IBOutlet weak var containerDetail: UIView!
@IBOutlet weak var placeName: UILabel!
@IBOutlet weak var logo: UIImageView!
@IBOutlet weak var stars: HCSStarRatingView!
var places = [PlaceModel]()
var markerDict: [Int: GMSMarker] = [:]
var selected: Int = 0
var callerLoaded: Bool = false
var mapLoaded: Bool = false
var zoom: Float = 15
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
containerDetail.isHidden = true
containerDetail.layer.borderWidth = 0.5
containerDetail.layer.borderColor = UIColor.gray.cgColor
logo.setRounded()
let camera = GMSCameraPosition.camera(withLatitude: 34.1381168, longitude: -118.3555723, zoom: zoom)
self.mapView.camera = camera
do {
if let styleURL = Bundle.main.url(forResource: "style", withExtension: "json") {
mapView.mapStyle = try GMSMapStyle(contentsOfFileURL: styleURL)
} else {
NSLog("Unable to find style.json")
}
} catch {
NSLog("One or more of the map styles failed to load. \(error)")
}
}
func load(){
var index: Int = 0
for place in places {
let marker = GMSMarker()
marker.position = CLLocationCoordinate2D(latitude: place.lat, longitude: place.lng)
marker.title = place.name
marker.snippet = place.name
marker.appearAnimation = kGMSMarkerAnimationPop
marker.map = self.mapView
markerDict[place.id] = marker
index = index + 1
}
}
}
load
中的方法MapViewController
已正确加载,但是,marker
已添加到map
。
我没有收到任何错误。
有些想法?
答案 0 :(得分:0)
这似乎是一个时间问题,你在这里设置控制器......
DispatchQueue.main.async(execute: {
// actually running on the main thread async
self.places.append(PlaceModel(_id: 0, _name: "Park", _lat: 34.1331168, _lng: -118.3550723, _icon: "i01" ) )
self.places.append(PlaceModel(_id: 1, _name: "Library", _lat: 34.1251168, _lng: -118.3590723, _icon: "i02"))
let mapVC = self.storyboard!.instantiateViewController(withIdentifier: "MapVC") as! MapViewController
mapVC.places = self.places
mapVC.callerLoaded = true
mapVC.load()
})
使用地点数组初始化视图控制器很好,但是当您调用mapVC.load()
时,您在视图加载之前调用它。您的地图仅在viewDidLoad
中正确初始化。所以你试图在地图完全就绪并且视图实际加载之前添加标记。
删除mapVC.load()
并在MapViewController的viewDidLoad()
末尾添加self.load()
,看看它是如何工作的。