全局变量不更新

时间:2015-01-02 17:21:15

标签: ios variables swift

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

第一堂课如下:

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 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()
    }
}

每次打开标签时都会调用该函数,但是出于某种原因,即使在我的updateLocation()函数正确更新距离并将其打印到Xcode之后,第一个类每次都会传递0.0。这里发生了什么?

2 个答案:

答案 0 :(得分:0)

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

您说的是value.fetchValues,但究竟是什么value?我没有理由相信value是正确的实例。而你遇到这个问题的事实表明事实并非如此。你是如何获得value的?

例如,如果您要实例化一个新的MapViewController,那么当然它的 distance是默认的0 - 它与{{1}的MapViewController不同正在更新。

编辑现在您已编辑了问题,以表明您在说:

distance

就像我猜到的那样。这是你的问题。

答案 1 :(得分:0)

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

AppDelegate中的

var distance : Float = 0.0 

并在两个ViewControllers中创建表示AppDelegate实例的变量。您可以使用AppDelegate执行此操作,因为此类只能有一个且只有一个实例。您尝试这样做不能使用ViewController类。我会建议你做,因为亚马也说并研究了什么类和实例,但无论如何..在两个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
    }
}