全局变量不更新

Global Variable not Updating

我有一个全局变量,我试图在一个 class 中更新它,然后传递给另一个 class 以更新 UITableview。

第一个 class 看起来像这样:

class MapViewController: UIViewController, CLLocationManagerDelegate, GMSMapViewDelegate {

    var distance: Float = 0.0

    //Called once a second
    func updateLocation() {
        if let mylocation = mapView.myLocation {
            self.distance += Distance(self.lastLocation, Coordinate2: mylocation.coordinate)
            println(self.distance)
            self.lastLocation = mylocation.coordinate
        }
    }
    func fetchValues(instrument: String) -> AnyObject {
        if instrument == "Distance" {
            return self.distance
        }
        else {
            return ""
        }
    }
}

在我的第二个 class 中,我有以下内容:

class StatusViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell: StatusCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as StatusCell
        let value = MapViewController()
        if indexPath.row == 1 {
            var distance: Float = Float(value.fetchValues("Distance") as NSNumber)/1.852
            cell.InstrumentValue.text = distance.description + " Nm"
        }
    }

    override func viewWillAppear(animated: Bool) {
        TableView.reloadData()
    }
}

每次我按预期打开选项卡时都会调用该函数,但由于某种原因,第一个 class 每次都会通过 0.0,即使在我的 updateLocation() 函数正确更新距离并将其打印到 Xcode。这里发生了什么?

这个故事中没有全局变量。 distance 在第一个文件中是一个 属性 - 一个实例变量。您只能获取此 class (MapViewController) 的特定实例的特定值。可以有很多 MapViewController 实例,每个实例都有不同的 distance.

你说的是 value.fetchValues,但 value 到底是什么?我没有理由相信 value 是这里的正确实例。而你遇到这个问题的事实表明它不是。你是如何获得value的?

比如你是实例化一个新的MapViewController,那么当然是its distance是默认的,0——是不一样的distance 正在更新的 MapViewController。

编辑 现在您已经编辑了您的问题以显示您在说:

    let value = MapViewController()

果然和我猜的一样。这就是你的问题。

您的问题的解决方案可能是在 AppDelegate.swift 文件中创建一个变量并从您的两个 ViewController 文件中访问它。

在 AppDelegate 中:

var distance : Float = 0.0 

并在两个 ViewController 中创建代表 AppDelegate 实例的变量。您可以使用 AppDelegate 执行此操作,因为此 class 只能有一个且只有一个实例。您不能像您尝试的那样使用 ViewController classes 来做到这一点。我会建议你按照 matt 所说的那样做,研究什么是 classes 和实例,但无论如何.. 在 ViewControllers

中写下这个
let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)

当您需要距离值时,您只需写

appDelegate.distance

示例:

let appDelegate = (UIApplication.sharedApplication().delegate as AppDelegate)
func updateLocation() {
    if let mylocation = mapView.myLocation {
        appDelegate.distance += Distance(self.lastLocation, Coordinate2: mylocation.coordinate)
        println(self.distance)
        self.lastLocation = mylocation.coordinate
    }
}