我有一个视图控制器,它有一个UICollectionView,从Firebase中提取信息。当用户访问此视图控制器时,他们的信息将放置在集合视图单元格中。
但是,当用户注销并使用其他帐户登录时,先前用户的数据将保留在集合视图中,而不是使用新用户的信息重新填充。
现在,所有内容都来自viewDidLoad()
:
override func viewDidLoad() {
super.viewDidLoad()
loadData()
loadOngoingQuest()
collectionView.dataSource = self
collectionView.delegate = self
}
loadData()
和loadOngoingQuest()
将Firebase中的信息提取到用于填充集合视图的数组中。
我尝试在viewWillAppear()
中添加所有内容,但它会导致一些故障,因为集合视图涉及滚动和其他动画,我不想在每次出现视图控制器时运行它们。
基本上我只是想在每次用户注销时重新加载整个视图控制器。我怎么能这样做?
答案 0 :(得分:1)
您应该这样做,请参阅评论以获取更多信息:
let firebaseAuth = FIRAuth.auth()
do {
try firebaseAuth?.signOut()
// clear the array that your collectionView is based on
// reload your collectionView (which will clear all the data since your array is empty)
} catch let signOutError as NSError {
print ("Error signing out: %@", signOutError)
}
<强>更新强>
另一种处理方式:
使用以下属性创建Struct
:
struct Global {
var isNewUser = false
}
每当您注销用户时,请执行以下操作:
Global.isNewUser = true
在collectionView
中,您检查Global.isNewUser == true
是否重新加载所有内容,最重要的是设置Global.isNewUser = false
。这样你只会加载一次。
答案 1 :(得分:0)
经过很多挫折之后,我发现了这个问题!
这与刷新集合视图或视图控制器无关。我使用Firebase引用错误。我在一个结构中保存了两个ref作为全局常量,希望不必在每个VC上声明它们。就像这样:
var questsRef = var questsRef = GlobalConstants.Refs.userRef.reference().child("quests")
然后我会在我的代码中的任何地方使用它们:
let userRef = AppDatabaseReference.users(uid: (Auth.auth().currentUser?.uid)!).reference()
这会导致问题,除非我终止应用并再次打开它,刷新这些变量。
我回到每个VC的顶部声明{{1}},它解决了这个问题!