Как правилно да отделя информация от TableView към ViewController

Опитвам се да предам някаква информация чрез преминаване от TableView към ViewController.

Чрез моето отстраняване на грешки мога да видя, че ViewController чете променливата, преди да бъде зададена в TableView. Това води до стойност нула (не е задължителна) вместо това, което очаквам, но ако се върна към моя 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]

}

GenViewController

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