在我的项目中,我删除了故事板中的所有segue并更改了所有
performSegue...
成为
pushViewController...
在我的应用程序中,75%的时间都可以完美运行。但是,当我在Firebase方法中时,我尝试这样做VC我会在屏幕上多次闪烁。
我认为Firebase与它有关,因为我创建了一个简单的方法
func testDel() {
if let addVC = self.storyboard?.instantiateViewController(withIdentifier: "AddCardVC") as? AddCardViewController {
self.navigationController?.pushViewController(addVC, animated: true)
print("foo")
}
}
它完全按照预期工作,去了第二个VC,就是它......
在发布我的代码之前,我为删除原始问题而道歉。我的编辑太多了。
到目前为止,我已经尝试将推送包裹在
中DispatchQueue.main.async {...}
这没有效果。
我去了第二个VC并注释掉了所有的功能,并在任何有pushVC的线上放置了断点,只是为了看它是否自动触发......
我在推送后立即在方法中放置了一个print语句并打印一次。我还在第二个VC ViewWillAppear中放置了一个print语句,并且被调用了5次。
我尝试评论我的推送代码,并在故事板上添加了一条segue线,并采用了老式的方式,并且做了类似的事情,但是我在控制台中有一个日志说
对开始/结束外观转换的不平衡调用 的UIViewController ...
当我使用push
时,这不会出现我还在SO上发现了一篇较旧的帖子,其中有人建议使用以下代码
var shouldPush = true
if let navigationController = self.navigationController {
for viewController in navigationController.viewControllers {
if viewController is AddCardViewController {
shouldPush = false
}
}
}
if shouldPush {
let addCrd = AddCardViewController(nibName: nil, bundle: nil) self.navigationController?.pushViewController(addCrd, animated: true)
}
这使得闪烁从大约5点变为2.仍然不是很好。
我的完整代码就是这个
// MARK: Delete Card with UIAlert
func deleteCard() {
let alertController = UIAlertController(title: "Wait!", message: "This will completely remove this card from your account. All the services linked to this card will be removed. Your total fixed monthly expenses will also be erased!", preferredStyle: UIAlertControllerStyle.alert)
let cancelAction = UIAlertAction(title: "Never Mind!", style: UIAlertActionStyle.cancel, handler: nil)
let okAction = UIAlertAction(title: "I Understand!", style: UIAlertActionStyle.default) { (result: UIAlertAction) in
let thisCard = self.ref.child("cards").child(self.thisCardIDTransfered)
let thisCardInUsers = self.ref.child("users").child((self.user?.uid)!).child("cards").child(self.thisCardIDTransfered)
thisCard.removeValue()
thisCardInUsers.removeValue()
let cardNode = self.ref.child("users").child((self.user?.uid)!).child("cards")
cardNode.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.hasChildren() {
if let walletVC = self.storyboard?.instantiateViewController(withIdentifier: "WalletVC") as? CardWalletViewController {
self.navigationController?.pushViewController(walletVC, animated: true)
}
} else {
if let addVC = self.storyboard?.instantiateViewController(withIdentifier: "AddCardVC") as? AddCardViewController {
self.navigationController?.pushViewController(addVC, animated: true)
print("foo")
}
}
})
}
alertController.addAction(cancelAction)
alertController.addAction(okAction)
self.present(alertController, animated: true, completion: nil)
}
答案 0 :(得分:0)
cardNode.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.hasChildren() {
...
} else {
...
})
可能会多次调用此观察者并使您的视图被多次推送,也许检查快照包含的内容可以帮助您解决问题。我猜测有时这个观察者会发射,快照可能是空的。
cardNode.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.value is NSNull {
//do Nothing
} else {
//check if it contains children
}
我不建议使用观察员来决定你应该展示什么样的观点。特别是因为你正在听.value
,因为它们可能意外发射而忘记删除观察者会导致许多错误。
答案 1 :(得分:0)
所以有人帮助了我,为什么打印报表的顺序一直发生直到他看到我的项目的其余部分,这是非常令人困惑的......
在其他ViewControllers上,我有Firebase观察方法....当我推送到另一个VC时,我只是添加到堆栈...该方法仍然在后台运行,所以我有2个观察员在做一个pushViewController。
我们最终将其中一些更改为ObserveSingleEvent ... 他告诉我,我们可以做完
viewDidDisappear
所以我想这有助于我更好地了解应用的运作方式。