我正在尝试通过段将一些信息从TableView传递到ViewController。
通过我的调试,我能够看到在TableView中设置变量之前,ViewController会读取该变量。这将产生一个nil值(这是一个可选的),而不是我所期望的值,但是如果我返回到我的tableView并再次选择这个值,它将正确地设置它自己。
我是需要以某种方式减慢viewDidLoad()中的读取速度,还是从tableView中遗漏了一些基本的segueing部分?我最好奇的是为什么第一次的值是零,而第二次的值是有效的。
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)!])
}设置我将在viewController中拉入的TableView中的值:
// 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中设置的值设置了一些标签,但它们返回nil (第一次,如果我返回并再次选择它们,它们将正确显示)
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()
}对我来说,这似乎是一个速度问题/并发问题?我尝试过使用viewWillAppear获取ViewController中的值(同样的问题),并使用sleep() (不太好,因为它会停止所有处理)。有人能给我指出解决方案的正确方向吗?
发布于 2016-10-13 01:59:54
这是我实现数据传递的方法。
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()将是根据发送的索引从数据库中提取数据的代码。
发布于 2016-10-13 02:13:57
嘿,所以我会尝试在didSelectCellAtIndexPath中调用fetchFbos(indexPath: indexPath),并从prepareForSegue中删除self.fetchFbos(_:)
下面的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)
}
})
}https://stackoverflow.com/questions/40004994
复制相似问题