我有一个全局变量,我试图在一个类中更新,然后传递给另一个类来更新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。这里发生了什么?
答案 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
}
}