使用segue将CLLocation传递到下一个视图

时间:2018-01-11 04:40:42

标签: ios swift segue core-location

我在主视图中获取当前位置,并希望使用segue将此位置对象传递到下一个视图。 segue可能是普通的“显示”类型的新视图页面,或“嵌入”类型的子视图。这是我的剧本:

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    var clmanager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        clmanager = CLLocationManager()
        clmanager.delegate = self
        clmanager.requestWhenInUseAuthorization()
        clmanager.startUpdatingLocation()
    }

    var location : CLLocation?
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        location = locations[0]
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if (segue.identifier == "showSegue") { // This part is totally OK
            let dest = segue.destination as! ShowViewController
            dest.object = self.location
        }

        if (segue.identifier == "embedSegue") { // This part is not OK!!!
            let dest = segue.destination as! EmbedViewController
            dest.object = self.location
        }
    }
}

我认为“显示”和“嵌入”类型之间的区别在于“显示”类型由用户激活手动,但“嵌入”类型立即 加载主视图时激活。那时,该位置尚不可用。

如何让“嵌入”部分成功? 我希望如果更新的位置可用,嵌入式子视图应自动更新

2 个答案:

答案 0 :(得分:0)

在detailViewController中添加它

var location : CLLocation?

//在第一个类中声明一个位置变量..

 var location : CLLocation?
    // Get location
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
       // Ammendment here
        location = locations[0]

    print(location)
}

// Pass to the next view
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "thisSegue") {
        let dest = segue.destination as! DetailViewController
        dest.location = self.location
    }
}

当didUpdateLocations方法中有可用的位置时,你需要确保show执行segue

答案 1 :(得分:0)

创建一个可以在类的任何部分访问的变量,并将您的位置存储在其中。在此之后,将该变量用于segue将不会成为问题。