无法将值从一个View Controller传递到另一个View Controller

时间:2015-11-24 11:03:29

标签: ios swift swift2

我正在学习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

3 个答案:

答案 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方法。