2015-01-02 2 views
0

У меня есть глобальная переменная, которую я пытаюсь обновить в одном классе, а затем перейти к другому классу, чтобы обновить 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() 
    } 
} 

Функция вызывается каждый раз, когда я открываю вкладку, как я предполагал, но для некоторых причина, по которой первый класс проходит 0.0 каждый раз, даже после того, как функция updateLocation() корректно обновляет расстояние и печатает его на Xcode. Что тут происходит?

ответ

0

В этой истории нет глобальных переменных. distance в первом файле является свойством - переменной экземпляра. Вы можете получить только конкретное значение конкретного экземпляра этого класса (MapViewController). Могут быть много экземпляров MapViewController, каждый из которых имеет разные distance.

Вы говорите value.fetchValues, но что такое value? У меня нет оснований полагать, что здесь value. И тот факт, что у вас возникает эта проблема, говорит о том, что это не так. Как вы получаете value?

Например, если вы инстанцировании новый MapViewController, то, конечно, егоdistance по умолчанию, 0 - это не то же самое MapViewController которого distance обновляется.

EDIT Теперь вы редактировали свой вопрос, чтобы показать, что вы говорите:

let value = MapViewController() 

Это так же, как я догадался. Там твоя проблема.

+0

Но во втором файле я объявляю переменное расстояние, чтобы иметь то же значение, что и глобальные переменную найдена в первом вызове fetchValues ​​функции(). Разве это не так? – user3185748

+0

Извинения. Обновлено и исправлено. - В следующий раз скопируйте и вставьте и отформатируйте свой код правильно.Ваш текущий код был неразборчиво отформатирован и не компилировался; Мне пришлось изменить его. Благодаря! – matt

+0

Извините, я случайно проигнорировал инициализацию экземпляра. Я редактировал приведенный выше код, чтобы отразить 'let value = MapViewController()' Как я могу создать экземпляр, который всегда соответствует 'расстоянию' первого файла? – user3185748

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 
    } 
} 
+0

Спасибо, я придумал еще одно решение с помощью Мэтта. Спасибо за ввод, хотя! – user3185748

Смежные вопросы