如何使用First ViewController中的信息每秒更新Second ViewController中的标签

时间:2015-11-03 16:25:55

标签: swift2

我有一个有两个ViewControllers的应用。首先,通过CLLocationManager实时计算当前速度。此外,还有一个标签,通过计时器(NSTimer)更新显示当前速度。在第二个ViewController中有另一个Label,其中也必须显示当前速度。它显示了它,但不更新。我尝试设置第二个计时器(不同的方式:在第一个VC中,在第二个VC中 - 总是出现错误或者什么都没有)。

非常感谢您的帮助,谢谢!

第一次VC

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var mapView: MKMapView!
    @IBOutlet weak var currentSpeedLabel: UILabel!

    var manager = CLLocationManager()                       
    var currentSpeed: CLLocationSpeed = CLLocationSpeed()   
    var timer = NSTimer()                                    

    override func viewDidLoad() {
        super.viewDidLoad()

        mapView.mapType = MKMapType.Hybrid                  

        trackingMe()                                        

    }



    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func HUDMapView(sender: AnyObject) {

        speedCount()

    }

    @IBAction func findMe(sender: AnyObject) {

        trackingMe()
    }


    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        let userLocation: CLLocation = locations[0] as CLLocation

        manager.stopUpdatingLocation()

        let location = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)
        let span = MKCoordinateSpanMake(0.05, 0.05)
        let region = MKCoordinateRegion(center: location, span: span)

        mapView.setRegion(region, animated: true)
    }


    func trackingMe() {

        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        manager.startUpdatingLocation()

        mapView.showsUserLocation = true

        currentSpeedUpdate()
    }


    func currentSpeedUpdate() {

        timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("speedCount"), userInfo: nil, repeats: true)

    }


    func speedCount() {

        currentSpeed = manager.location!.speed
        currentSpeedLabel.text = String(format: "%.0f km/h", currentSpeed * 3.6)

    }

    override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) {

        let speedController = segue.destinationViewController as! speedViewController

        currentSpeed = manager.location!.speed
        speedController.showSpeed = currentSpeedLabel.text

    }

} 

第二个VC

    import UIKit

class speedViewController: UIViewController {

    @IBOutlet weak var secondSpeedLabel: UILabel!

    var showSpeed: String!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        secondSpeedLabel.text = showSpeed

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func back(sender: AnyObject) {

        self.dismissViewControllerAnimated(true, completion: nil)

    }

}

1 个答案:

答案 0 :(得分:1)

http://www.fubra.com/blog/2008/01/07/htaccess-vs-httpdconf/

您可以使用Singleton来保存LocationManager。然后,您可以从您的应用程序中访问它。当您转移到第二个VC时,您可以将委托更改为第二个VC,也可以手动获取所需的数据。

请记住,代表只能指向一个“接收者”。更改委托将停止第一个VC中的更新。但由于它现在是一个单身人士,你还可以在那里存储有关过去位置/速度的信息。当解雇第二个VC时,获取存储的数据并进行更新。

这将一直运行,直到您致电stop()

代码进行了简化,以说明这个想法。

VC代码:

import UIKit
import CoreLocation

class ViewController: UIViewController, TrackerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        Tracker.shared.delegate = self
        Tracker.shared.start()

    }

    func speedUpdate(speed: CLLocationSpeed) {
        print(speed)
    }
}

单身人士代码:

import UIKit
import MapKit
import CoreLocation

class Tracker: NSObject, CLLocationManagerDelegate {

    static var shared = Tracker()

    private var manager = CLLocationManager()
    private var timer = NSTimer()

    var region : MKCoordinateRegion?
    var currentSpeed: CLLocationSpeed = CLLocationSpeed()

    weak var delegate : TrackerDelegate?

    private override init() {
        super.init()

        manager.delegate = self
        manager.requestWhenInUseAuthorization()
    }


    internal func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

        manager.stopUpdatingLocation()

        let userLocation: CLLocation = locations[0] as CLLocation
        let coordinates2D = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude, longitude: userLocation.coordinate.longitude)
        let span = MKCoordinateSpanMake(0.05, 0.05)

        region = MKCoordinateRegion(center: coordinates2D, span: span)

        currentSpeed = userLocation.speed

        guard let del = delegate else {
            return
        }

        del.speedUpdate(currentSpeed)

    }


    func start() {

        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.startUpdatingLocation()

        timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("loopUpdate"), userInfo: nil, repeats: true)

    }

    func stop() {
        timer.invalidate()
    }


    internal func loopUpdate() {
        // restart updating
        manager.startUpdatingLocation()

    }
}

代表Singleton:

向当前函数添加更多函数或更多值以获得更多反馈。

protocol TrackerDelegate : class {

    func speedUpdate(speed:CLLocationSpeed)

}