Как правильно перевести информацию из TableView в ViewController

Я пытаюсь передать некоторую информацию через переход от TableView к ViewController.

Благодаря моей отладке я вижу, что ViewController считывает переменную до того, как она будет установлена ​​в TableView. Это приводит к значению nil (это необязательно) вместо того, что я ожидаю, но если я вернусь к своему tableView и снова выберу значение, оно будет установлено правильно.

Нужно ли мне как-то замедлить чтение в viewDidLoad() или я упустил какую-то основную часть перехода из tableView? Мне больше всего любопытно, почему значение равно нулю в первый раз, но работает во второй раз.

Переход от TableView:

// MARK: - Send information to the FBOSelector
// Send the fieldName the user selects
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

let destination = segue.destinationViewController as! FBOSelectorViewController

let path = tableView.indexPathForSelectedRow
destination.fieldName = self.locations[(path?.row)!]

self.fetchFbos(self.locations[(path?.row)!])

}

Установка значений в TableView, которые я буду тянуть в viewController:

// This is failing because the values are read in FBOSelector before they are set here
// Using the fieldname selected pass the rest of the information to FBOSelector
func fetchFbos(fieldName: String) {
    let ref = FIRDatabase.database().reference().child("Airport/\(fieldName)/FBOs/Signature")

    ref.observeEventType(.Value, withBlock: { (snapshot) in
        //           print(snapshot)
        if let dictionary = snapshot.value as? [String: AnyObject] {
            RegistrationsManager.sharedManager.activeReservation.firfullName = dictionary["fullname"] as? String
            // This will fire after the value in FBOSelector is read
            print("DELAYED SETTER")
            print(RegistrationsManager.sharedManager.activeReservation.firfullName)
        }
    })
}

В TableView я устанавливаю некоторые метки со значением, которое я установил в TableView, но они возвращают ноль (в первый раз, если я вернусь и выберу их снова, они отображаются правильно)

func firebaseInfo() {
    self.fieldNameLabel.text = fieldName
    self.locationLabel.text = RegistrationsManager.sharedManager.activeReservation.firfullName
    //*** BUG IS HERE ***
    // On first click locationLabel is nil
//        print("DEBUG INFO")
        print(RegistrationsManager.sharedManager.activeReservation.firfullName)
}

И затем я запускаю его в viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    fboCollectionView.delegate = self
    fboCollectionView.dataSource = self
    fboCollectionView.pagingEnabled = true

    firebaseInfo()
}

Мне кажется, проблема со скоростью/параллелизмом? Я пытался получить значение в ViewController с помощью viewWillAppear (та же проблема) и с помощью sleep() (бесполезно, потому что он останавливает всю обработку). Может ли кто-нибудь указать мне правильное направление решения?


person Rudest Buddhist    schedule 12.10.2016    source источник


Ответы (2)


Это мой метод для передачи данных.

TableViewController

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let selectedIndexPath:NSIndexPath = self.tableView.indexPathForSelectedRow!
        let genVC:genViewController = segue.destinationViewController as! genViewController
        genVC.selectedItem = myData[selectedIndexPath.row]

}

Генвиевконтроллер

var selectedItem: NSManagedObject?
override func viewDidLoad() {
   super.viewDidLoad()
   fetchData()
}

fetchData() будет кодом для извлечения данных из базы данных на основе отправленного индекса.

person MwcsMac    schedule 12.10.2016

Эй, я бы попробовал вызвать fetchFbos(indexPath: indexPath) в didSelectCellAtIndexPath и удалить self.fetchFbos(_:) из prepareForSegue

Приведенный ниже fetchFbos(indexPath: IndexPath) выполнит переход после получения нового значения от firebase.

func fetchFbos(indexPath: IndexPath) {
 let fieldName = self.locations[indexPath.row]
 let ref = FIRDatabase.database().reference().child("Airport/\(fieldName)/FBOs/Signature")

ref.observeEventType(.Value, withBlock: { (snapshot) in
    //           print(snapshot)
    if let dictionary = snapshot.value as? [String: AnyObject] {
        RegistrationsManager.sharedManager.activeReservation.firfullName = dictionary["fullname"] as? String
        // This will fire after the value in FBOSelector is read
        print("DELAYED SETTER")
        self.performSegue(identifier: segueId, 
       sender: self)
        print(RegistrationsManager.sharedManager.activeReservation.firfullName)
    }
})
}
person MasterMan07    schedule 12.10.2016