我正在学习Swift并做一个项目,我想从一个视图控制器发送一个CLLocationCoordinate2D数组到另一个视图控制器(Map View),这样我就可以一次绘制多个注释。如果我的CLLocationCoordinate2D数组有5组经度和纬度,我希望它们全部传递给我的MapViewController,我希望在没有用户交互的情况下在MapView中绘制所有注释。
问题:在我的MapView中,我看到的所有内容都是console []中的空输出,但我从初始视图控制器传递了一组经度和纬度。我怎样才能保持价值不变? `
问题:一旦我获得了Map2ViewController中的所有坐标,那么我可以简单地遍历所有元素来绘制注释,因为地图正在MapView中加载吗?
以下是我迄今为止所尝试的内容。
我的“SearchBloodViewController.swift”//这是我生成经度和纬度的初始视图。
import UIKit
import MapKit
class SearchBloodViewController: UIViewController, UITextFieldDelegate, CLLocationManagerDelegate
{
var array: [PFObject] = [PFObject]()
var arra: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]()
var lat_: Int = 0
var long_: Int = 0
@IBOutlet weak var bloodType: UITextField!
@IBAction func search(sender: UIButton)
{
var query = PFQuery(className: "_User")
query.whereKey("BloodGroup", equalTo: bloodType.text!)
do
{
try array = query.findObjects() as [PFObject]
}
catch
{
}
for arr in array
{
self.lat_ = arr["Latitude"] as! Int
self.long_ = arr["Longitude"] as! Int
var cor = CLLocationCoordinate2D.init(latitude: Double(self.lat_), longitude: Double(self.long_))
arra.append(cor)
}
print(arra)
// The console Output of this is
// [C.CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0),
//C.CLLocationCoordinate2D(latitude: 42.0, longitude: -75.0),
//C.CLLocationCoordinate2D(latitude: 41.0, longitude: -87.0)]
}
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!)
{
if (segue.identifier == "drawmap")
{
let navigationController = segue.destinationViewController as! UINavigationController
let controller = navigationController.topViewController as! Map2ViewController
// controller.delegate = self
controller.ar = self.arra
}
}
override func viewDidLoad()
{
super.viewDidLoad()
}
我的Map2ViewController :(其中有MapView)
import UIKit
import MapKit
class Map2ViewController: UIViewController
{
var ar: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]()
@IBOutlet weak var dispAnnotation: MKMapView!
override func viewDidLoad()
{
super.viewDidLoad()
print("The values received are \(ar)")
}
}
请参阅:segue名称是“drawmap”。故事板有SearchBloodViewController-> NavigationController-> Map2ViewController
答案 0 :(得分:1)
在Map2ViewController
上,在此行中:
var ar: [CLLocationCoordinate2D] = [CLLocationCoordinate2D]()
您正在创建一个具有默认值的数组(数据类型为CLLocationCoordinate2D的数组的新实例),因此当您加载此控制器时,ar的内容会被空数组重写,您只需要创建一个可空的var,可以通过segue进行识别:
var ar : [CLLocationCoordinate2D]?
其他一切看起来都不错。
编辑: ar
是一个可选的var,所以如果你想打印它的内容,你需要像这样打开它:
if let notNullArray = ar {
print("The values received are \(notNullArray)")
}
答案 1 :(得分:0)
let controller = navigationController.topViewController as! Map2ViewController
当调用上面的行时,您的viewDidLoad将被调用,因为您的导航控制器将呈现Map2ViewController。 因此,它将在Map2ViewController的viewDidLoad方法中打印一个空白数组。 我建议你在Map2ViewController的初始化方法中传递数组。
上述方法适用于没有故事板的情况。
对于您的情况,我建议您在Map2ViewController的ar
变量的setter方法中执行任何操作。
您可以按照以下方式执行此操作:
var ar: [CLLocationCoordinate2D] = {
didSet {
print("The values received are \(ar)")
}
}
答案 2 :(得分:0)
修复了我的错误。实际上我在搜索操作中设置坐标的所有值。我现在正在做的是我采用了搜索操作中的完整逻辑并将其放入Prepareforsegue部分。所以现在我的搜索操作是空的,只做一件让我进入下一个屏幕的地方,即map2ViewController。整个计算和设置经度和纬度代码已经准备好segue方法。