从 Firebase 更新值后,如何停止 reloadData 滚动到我的应用顶部?

Posted

技术标签:

【中文标题】从 Firebase 更新值后,如何停止 reloadData 滚动到我的应用顶部?【英文标题】:How stop reloadData scrolling to the top of my app after updating values from Firebase? 【发布时间】:2019-02-06 09:52:35 【问题描述】:

我正在使用来自 Firebase 和 CollectionViews 的 Observes 来填充我的单元格中的信息。我的所有数据都正确显示在我的 collectionView 上,当我在 Firebase 中完成更新帖子中的值时出现问题,应用程序在更新后开始向上滚动并复制单元格中的值。

我已经尝试在我使用的大多数常用函数中调用 reloadData,但一直滚动到顶部。只有当我用相机拍照时才会出现重复的单元格。

var postVibe = [PostVibe]()
fileprivate func fetchPostWithUser() 
    guard let uid = Auth.auth().currentUser?.uid else  return 
    guard let city = CityState.currentCity else  return 
    let ref = Database.database().reference().child("vibes").child("city").child(city)
    ref.observe(.value, with:  (snapshot) in
        self.postVibe.removeAll()
        if snapshot.exists() 
            self.collectionView.refreshControl?.endRefreshing()

            guard let vibeDic = snapshot.value as? [String: Any] else  return 
            vibeDic.forEach( (key, value) in
                guard let newDic = value as? [String: Any] else  return 
                var vibe = PostVibe(postId: key, dictionary: newDic)

                Database.database().reference().child("votes").child(vibe.postId).child(uid).observe(.value, with:  (snapshot) in
                    if snapshot.exists() 

                        if let value = snapshot.value as? Int, value == 1 
                            vibe.hasVoteUp = true
                            vibe.hasVoteDown = false
                         else 
                            vibe.hasVoteUp = false
                            vibe.hasVoteDown = true
                        

                     else 

                    
                    self.postVibe.append(vibe)
                    DispatchQueue.main.async 
                        self.collectionView.reloadData()
                    
                , withCancel:  (err) in
                    print("Failed to fetch Votes: ", err)
                )
            )

         else 
            self.collectionView.refreshControl?.endRefreshing()
        
    )  (err) in
        print("Failed to fetch Vibes: ", err)
    

我希望我的代码能够删除旧数据并仅显示新数据,其中包括已更新的数据,当我只需要 3 个时,我希望不会显示 6 个重复的单元格在数据库中。

【问题讨论】:

您可以使用 scrollToItem 方法滚动到所需的行或根据需要设置 contentoffset 我使用 contentoffset,现在正在处理重复的单元格,但滚动到集合视图的顶部仍然发生 【参考方案1】:

这是我用于 tableView 滚动的,如果可能的话,您可以将其用于 collectionView。

 let contentOffset = tableView.contentOffset
    tableView.reloadData()
    tableView.setContentOffset(contentOffset, animated: false)

【讨论】:

感谢此修复重复的单元格,但仍滚动到 collectionView 的顶部你认为是因为我从 Firebase 观察或我的重新加载数据放置在错误的位置

以上是关于从 Firebase 更新值后,如何停止 reloadData 滚动到我的应用顶部?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase A/B 测试离线行为

谷歌 6 月 17 日 Firebase SDK 更新后,Ionic Cordova 应用程序停止编译

即使在手动更新 TEXTAREA 值后如何强制 jQuery.text() 工作? [复制]

更新表格视图单元格中的核心数据值后如何刷新

如何停止在 iOS 上跟踪 in_app_purchase Firebase 事件?

如何从 Firebase 更新电子邮件? UpdateEmail 方法已被弃用