全局变量不更新
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
}
}
我有一个全局变量,我试图在一个 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
}
}